如何在Ocaml中使用[x]?

时间:2011-12-22 02:40:22

标签: list ocaml

例如:当我想用[1, 2, 3]连接int:x的列表时,我的代码是:

[1,2,3] @ [x]

但在另一种情况下,我有一个函数,列表是一个参数,

val foo : int list

我有另一个函数print_foofoo是一个参数,返回类型是

val print_foo : int list list

我写了一个函数:print_foo [foo]

我的问题是:在这种情况下,[foo]被类型检查接受,但是它是正确的 逻辑意义?写这个函数的好方法是什么?这是[[x]]

的同一个问题

您能否向我解释一下如何以及何时可以使用[x][[x]]等等?

非常感谢,

3 个答案:

答案 0 :(得分:3)

[x]表示包含一个元素的列表:x

[[x]]表示包含一个元素的列表:包含一个元素的列表:x

因此,如果您说x4,则[x] = [4]是仅包含4的列表,而[[x]] = [[4]]是仅包含[x]的列表列表只包含4。

如您所见,x只是将x = [1, 2, 3]放入列表中。如果x(即[x] (= [[1, 2, 3]])本身就是一个列表),那么您可能不希望使用foo调用函数,然后给它一个包含原始列表的列表而不是列表本身。当然,这在某些情况下可能是完全合法的,但如果您不确定,则很可能不需要它。

因此,如果您int listprint_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]。因此fooint list所以[foo]只是int list的列表(int list) list