类型
类型及其重要性
Luna可以处理任何种类的数据。
可以计算小汽车的速率,回复用户的提问(通过类似聊天的接口)或最近一次去旧金山旅行的照片。
一些操作只对特定的数据有用。
用户可以给数值作乘积,可是很难想象“蛋糕乘法”的结果。
别的操作允许某种程度的自由,完全相反地,例如面对不管具体元素是什么的列表。
还有的操作提供更复杂的约束。
列表求和只对包含数值元素的非空列表有用,其实用户真的不关心这些元素的具体结构,整型、分数,甚至矩阵,只需要额外定义操作。
本节介绍类型系统,就是Luna处理这些约束的方式。
将学习到如何定义类型,如何检查给定值得类型以及当约束不能被解决时会发生什么。
类型系统背后的哲学是提供尽可能安全、游泳的线索,在不束缚用户表达力的前提下。
类型作何理解
Luna的系统类型和现今所用的编程语言有着本质的区别。
从头设计、直到需要时才可见,且能感知正在处理的数据结构。
不需要手动定义数据的类型,类型推断器自动计算场景背后的每个单独类型。
这个计算保证每个操作被安全执行,不会出现任何矛盾内容。
因为代码中通常不表达类型,需要一种显示给用户的方法。
用户可能已经注意到可视化编辑器随机地、以不同颜色进场。
这些颜色正是可视化编辑器沟通类型的方式之一。
节点的每个端口分配一种对应其类型的颜色。
所有的连接也被着色,表示通过该连接传递的数据类型。
颜色最能表征数值类型是相同或不同,但不是足够的。
试想引用类型是“magenta”的文本“hello world!”。
这是颜色仅作为可视化辅助的原因,真实的类型有文本表示法。
如果用户(的鼠标指针)从一个节点“飘过”,真实类型被显示。
节点的每个输入和输出都显示其对应的类型。
上图中,可以看到真实的类型名称,这样有助理解节点的行为。
- 节点“number2”和节点“number3”没有输入,都是Real类型常量。
- 节点“sum3”有两个Real类型输入和一个Real类型输出,把两个Real类型数值转换成另一个Real类型数值。
- 节点“just2”有一个Real类型输入和一个Maybe Real输出,把一个Real类型数值转换成一个Maybe Real类型数值。
噢~“hello world!”的类型不是“magenta”,是Text。
异常保护
除了提供程序行为较好的理解,类型还要扮演更重要的角色:确保一切将顺利安全地开展。
这对防止开发中可能意外发生的很多错误至关重要。
因此,出错了会发生什么?
一起尝试明明白白地糊涂一次(clearly nonsensical):添加一个文本和一个数值。
Luna的反应是:
Luna的类型检查器已经找出有关错误。
求和(+)函数仅对相同类型参数有用,因此“抱怨”:“Real和Text不是相同的、不能安全继续”。