例如:当我想用[1, 2, 3]
连接int:x
的列表时,我的代码是:
[1,2,3] @ [x]
但在另一种情况下,我有一个函数,列表是一个参数,
val foo : int list
我有另一个函数print_foo
,foo
是一个参数,返回类型是
val print_foo : int list list
我写了一个函数:print_foo [foo]
我的问题是:在这种情况下,[foo]
被类型检查接受,但是它是正确的
逻辑意义?写这个函数的好方法是什么?这是[[x]]
您能否向我解释一下如何以及何时可以使用[x]
或[[x]]
等等?
非常感谢,
答案 0 :(得分:3)
[x]
表示包含一个元素的列表:x
。
[[x]]
表示包含一个元素的列表:包含一个元素的列表:x
。
因此,如果您说x
是4
,则[x] = [4]
是仅包含4
的列表,而[[x]] = [[4]]
是仅包含[x]
的列表列表只包含4。
如您所见,x
只是将x = [1, 2, 3]
放入列表中。如果x
(即[x] (= [[1, 2, 3]])
本身就是一个列表),那么您可能不希望使用foo
调用函数,然后给它一个包含原始列表的列表而不是列表本身。当然,这在某些情况下可能是完全合法的,但如果您不确定,则很可能不需要它。
因此,如果您int list
是print_foo [foo]
,然后再拨打print_foo foo
,则说:“打印此列表包含我要打印的列表。”您可能想要说的是{{1}},其中省略了冗余列表包装器。这可以解释为“打印此列表我想要打印。”
答案 1 :(得分:3)
当你有类型时,它总是更简单:
int list
是一个包含整数的列表:
# let x = [1;2;3];;
val x : int list = [1;2;3]
# List.hd x;; (* return the first element of x *)
- : int = 1
int list list
是一个包含int list
的列表:
# let y = [x;[4;5]];;
val y : int list list = [[1;2;3];[4;5]]
# List.hd y;; (* return the first element of y *)
- : int list = [1;2;3]
等等。
此外,如果要将整数列表[1;2;3]
与整数列表x
连接起来,则应使用:
[1;2;3] @ x
因为@
的类型为'a list -> 'a list -> 'a list
,即。它需要两个相同类型的列表并返回一个相同类型的新列表。
答案 2 :(得分:1)
int list list
实际上是(int list) list
,可以表示为[an_int_list, another_int_list]
或[the_single_element_which_is_an_int_list]
。因此foo
是int list
所以[foo]
只是int list
的列表(int list) list
。