2011-12-22 22 views
4

例如:當我想Concat的INT的列表:[1, 2, 3]x我的代碼是:如何在Ocaml中使用[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]]等...?

非常感謝你,

回答

3

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

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

所以,如果你說的是x4,然後[x] = [4]僅包含4名單,並[[x]] = [[4]]是隻含含名單榜上有名的唯一一家四

正如你看到的,[x]只是把x成一個列表本身。如果x = [1, 2, 3](即x本身就是一個列表),那麼你可能不想用[x] (= [[1, 2, 3]])調用一個函數,然後給它一個包含原始列表的列表,而不是列表本身。當然,在某些情況下,這可能是完全合法和需要的,但如果您不確定,最有可能不需要。

所以,如果你有fooint list,然後你打電話print_foo [foo],你說:「打印這個列表包含我想打印的列表。」你可能想要說的是print_foo foo,你忽略了冗餘列表包裝器。這可以解釋爲「打印這個列表我想打印。「

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

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,即。它需要兩個相同類型的列表,並返回一個同樣類型的新列表。