类型

类型及其重要性

Luna可以处理任何种类的数据。

可以计算小汽车的速率,回复用户的提问(通过类似聊天的接口)或最近一次去旧金山旅行的照片。

一些操作只对特定的数据有用。

用户可以给数值作乘积,可是很难想象“蛋糕乘法”的结果。

别的操作允许某种程度的自由,完全相反地,例如面对不管具体元素是什么的列表。

还有的操作提供更复杂的约束。

列表求和只对包含数值元素的非空列表有用,其实用户真的不关心这些元素的具体结构,整型、分数,甚至矩阵,只需要额外定义操作。

本节介绍类型系统,就是Luna处理这些约束的方式。

将学习到如何定义类型,如何检查给定值得类型以及当约束不能被解决时会发生什么。

类型系统背后的哲学是提供尽可能安全、游泳的线索,在不束缚用户表达力的前提下。

类型作何理解

Luna的系统类型和现今所用的编程语言有着本质的区别。

从头设计、直到需要时才可见,且能感知正在处理的数据结构。

不需要手动定义数据的类型,类型推断器自动计算场景背后的每个单独类型。

这个计算保证每个操作被安全执行,不会出现任何矛盾内容。

因为代码中通常不表达类型,需要一种显示给用户的方法。

用户可能已经注意到可视化编辑器随机地、以不同颜色进场。

这些颜色正是可视化编辑器沟通类型的方式之一。

节点的每个端口分配一种对应其类型的颜色。

所有的连接也被着色,表示通过该连接传递的数据类型。

类型 - 图1

颜色最能表征数值类型是相同或不同,但不是足够的。

试想引用类型是“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的反应是:

类型 - 图2

Luna的类型检查器已经找出有关错误。

求和(+)函数仅对相同类型参数有用,因此“抱怨”:“Real和Text不是相同的、不能安全继续”。