我得到数据类型,但在sml中定义类型有什么意义?

时间:2013-03-13 21:12:10

标签: sml

似乎在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定义的情况是什么?

2 个答案:

答案 0 :(得分:3)

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

假设您有一个使用real * real表示的2种类型的模块 例如,像你的例子中的2d点,以及由斜率和y截距表示的线。现在,如果您正在编写像lies_on_line这样的函数,它接受一个点和一行并返回一个布尔值,无论该点位于该行上,您有2个签名选项:

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

奥德

val lies_on_line : point * line -> bool 

很明显,第二个例子使得犯错更难。

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

答案 1 :(得分:2)

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

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

type Word = string
type Sentence = Word list

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