如何在不连接的情况下将列表插入另一个列表

时间:2019-01-15 17:52:17

标签: sml

例如说我有一个列表[1,5,10],如何将其放入一个空列表中使其成为[[1,5,10]

1 个答案:

答案 0 :(得分:0)

由于[[1,5,10]不是有效列表,因此我假设您的意思是[[1,5,10]],即 int列表。您可以像刚才那样创建这样的列表:[[1,5,10]]。对任意的 int列表执行此操作可以像这样:

fun singleton (xs : int list) = [xs]

val test_1 = singleton [1,5,10]  (* = [[1,5,10]] *)

没有串联发生,因为这是同义的:

- [1,5,10] :: [];
> val it = [[1, 5, 10]] : int list list

也就是说,将列表[1,5,10]放在空白列表的前面。

这演示了::(cons)运算符。如果您想将多个元素(例如,多个 int列表)放在彼此前面,这就是所谓的串联,您可以使用@(附加)运算符,例如喜欢:

- [1,5,10] @ [11,15,20]
> val it = [1, 5, 10, 11, 15, 20] : int list

最后,有一个List.concat运算符获取列表列表并将其全部追加:

- List.concat [ [1,2,3], [4,5,6], [7,8,9] ];
> val it = [1, 2, 3, 4, 5, 6, 7, 8, 9] : int list

此时,一个好的练习是定义此递归函数:

fun my_concat [] = ...
  | my_concat (xs :: xss) = ...

其中xs是列表列表中的第一个列表,而xss是列表的其余列表。

(我试图通过给xs一个复数名称和xss一个双复数名称来强调这一点。)