2013-04-11 162 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