3

似乎在 SML 中定义类型并没有帮助:

type point = int * int
val origin : point = (0, 0)

但我可以很容易地只使用int * int打字方法,不是吗?与数据类型相比,您似乎可以用它做更多有趣的事情,例如:

datatype Point = PlanePoint of (int * int) | SpacePoint of (int * int * int)
val origin : Point = SpacePoint(0, 0, 0)

出于好奇,在哪些情况下您真的需要type定义?

4

2 回答 2

3

原因主要是类型安全。我将尝试用一个简单的例子来解释。

假设您有一个使用 2 种类型的模块,real * real 例如,您的示例中的 2d 点,以及由斜率和 ay 截距表示的线。现在,如果您正在编写一个函数,例如lies_on_line它需要一个点和一条线并返回一个布尔值是否该点位于该线上,您有 2 个签名选择:

val lies_on_line : (int * int) * (int * int) -> bool

奥德

val lies_on_line : point * line -> bool 

很明显,第二个例子更难出错。

此外,虽然它对模块更有好处,但命名类型允许您更改其表示,而无需更改使用该类型的代码(间接通过模块)。

于 2013-03-13T21:58:26.570 回答
2

在问题域的上下文中为您的类型定义别名是有意义的。这样你就可以在你的设计中考虑更相关和更有意义的类型。

例如,如果您正在编写文字处理器程序,那么您的类型如下:

type Word = string
type Sentence = Word list

这可能比字符串和字符串列表更有意义。

于 2013-03-14T18:20:35.280 回答