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

我得到了数据类型,但是在sml中定义类型有什么意义呢?,sml,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) 出于好

在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)

出于好奇,什么情况下你真的需要定义一个
类型?

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

假设您有一个使用两种类型的模块,它们用
real*real
例如,如示例中所示的二维点,以及由坡度和y轴截距表示的线。现在,如果您正在编写一个函数,如
lies_on_line
,它接受一个点和一条线,并返回一个布尔值,无论该点是否位于该线上,您有两个签名选项:

val lies_on_line : (int * int) * (int * int) -> bool
作战需求

很明显,第二个例子使犯错误更加困难


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

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

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

type Word = string
type Sentence = Word list

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

比模块外绝对必要的编程更好?是的,它完全是可选的。就我个人而言,我不会经常这样做,除非我计划以后可能会改变具体的类型。然而,我使用OCaml,它也有标签参数,这些参数在使用中重叠,并且更轻量级。这主要是个人偏好。这似乎是错误的。这两个签名是等效的,所以除非我误解了你所说的“类型安全性”,否则这里没有提供任何签名。该语言允许类似于
typemyint=int
valx=3:myInt
valy=x:int
。如果您想要一个独特的签名,编译器强制执行类型安全和错误预防,你需要使用一个
datatype
,就像OP建议的那样:
type myInt=MY_INT of INT
val x=MY_INT 3
val MY_INT y=x
。确实,你必须将
线
抽象化才能实现某种类型安全性。我不太熟悉SML,不知道如何使用它,但使用OCaml,您只需在mli中定义
类型点
类型行
type Word = string
type Sentence = Word list