sml - 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] 等等……
这就是原因吗?还有别的吗?
解决方案
在 SML 中,列表定义如下:
datatype 'a list = nil | :: of 'a * 'a list
特别::
是 是类型的中缀构造函数'a * 'a list -> 'a list
。
语法[1, 2, 3]
是糖1 :: 2 :: 3 :: nil
。
您不仅需要构造包含int
s 的列表(即 where 'a = int
);例如,您可以有一个包含 int list
s 的列表,即一个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] *)
推荐阅读
- javascript - 将输入用作数组,然后乘以索引值并得到总和
- visual-studio - 如何在 Sql Schema Compare 中“忽略更改跟踪”?
- python - 使用类时需要解压的值太多
- linux - steam网页如何在我的PC上执行终端和shell?
- sas - 如何从SAS中的列中选择百分比值?
- c++ - 使用枚举和 getline
- c++ - 我可以在不编辑类方法本身的情况下添加方法吗?
- mysql - 尝试使用 MySQL 和 node.js 时的 Connection_refused。使用cmd时它确实有效
- git - 如何清理一个 git 项目
- angular - 仅获取类中唯一的属性值