::```?,sml,smlnj"/>

首页 > 解决方案 > SML: Operator ```::``` 是正确的联想,应该用作 ```::```?

问题描述

好的,所以我对 cons 运算符有点困惑::: 我知道这是可以接受的:

   > [2]
   or this
   2::[2,4]
   > [2,2,4]
and i know this is forbbiden
   [2]::[3]
it won't work.
but I recently found out that :
  [2]::[3]::nil
will work :
 > [[2],[3]]
or 
 [2]::[] will do as well.
 >[[2]]

我的问题是为什么?我在想,也许这是一个规则,如果我有一个类型为 a 的列表,那么使用运算符 cons 我只能创建一个类型为 a 的新列表。所以例如当我有

[2] :: [3]
我的列表具有 int 类型的元素,但我要求将非初始值 [3] 连接到 int 列表中?
但是当我有 [2]::[3]::[] 时,空列表 [] 可以是任何类型的空列表,所以在这里我需要它是一个空列表,其中包含 [3] 之类的元素,所以它将元素 [3] 添加到 nil 中,然后添加元素 [2] 等等……
这就是原因吗?还有别的吗?

标签: smlsmlnj

解决方案


在 SML 中,列表定义如下:

datatype 'a list = nil | :: of 'a * 'a list

特别::是 是类型的中缀构造函数'a * 'a list -> 'a list

语法[1, 2, 3]是糖1 :: 2 :: 3 :: nil

您不仅需要构造包含ints 的列表(即 where 'a = int);例如,您可以有一个包含 int lists 的列表,即一个int list list. 这就是你创建的:

[2] :: [3] :: nil
(* can be sugared as *)
[[2], [3]]

(同样,您可以选择'a = string并创建列表"hello" :: "world" :: nil,即["hello", "world"]。)


如果你想追加两个列表,你可以使用 infix @,它的 type 'a list * 'a list -> 'a list。例如:

[1, 2] @ [3]
(* evaluates to [1, 2, 3] *)

推荐阅读