2013-04-11 161 views
2

我希望這對你們中的一些人來說會很容易。 我發現在這個論壇這個解決方案:Ocaml中的int列表列表的移調

let rec transpose list = match list with 
| []    -> [] 
| [] :: xss -> transpose xss 
| (x::xs) :: xss -> 
    (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss) 

這是一個列表的列表的換位和它的偉大工程。

現在我需要相同的這個,而不是將列表列表轉換爲列表列表以將int列表列表轉置爲列表列表。

謝謝大家!

回答

5

這就是多態性的意義所在。 'a類型可以是任何類型,因此您找到的解決方案與int list list一樣適用。

如果你真的想類型爲int list list -> int list list一個功能,你可以隨時強制使用類型註釋:

let int_transpose : int list list -> int list list = transpose 

但我不明白你爲什麼會。

+0

是的,我知道'a可以是任何類型,並且效果更好,但是我必須這樣做。你能告訴我還是寫下整個代碼,我可以強制你寫這個函數。謝謝! – Marko 2013-04-11 11:12:16

+0

@Marko只需添加我寫的單行(當然,您可以將'int_transpose'更改爲任何名稱)到您所寫的'transpose'的定義。如果你願意,你也可以直接註釋'transpose':'let rec transpose(list:int list list):int list list = ...' – cygin 2013-04-11 11:35:14

+1

你也可以在你的函數中添加一個返回類型註釋:'let rec transpose list:int list list = match ...'由於cygin告訴你,這隻會改變類型,而不會改變函數的行爲。所以除了文檔以外,沒有真正的理由這樣做。在某些情況下,代碼運行速度更快,多態性更少,但這不是這種情況,因爲它只是執行列表操作。這些對於所有元素類型都是相同的。 – 2013-04-11 14:46:24