代码在Elm中编译,但不在Haskell中编译
目前我正在尝试学习Haskell,但我偶然发现了一个我不理解的错误:代码在Elm中编译,但不在Haskell中编译,haskell,matrix,functional-programming,transpose,elm,Haskell,Matrix,Functional Programming,Transpose,Elm,目前我正在尝试学习Haskell,但我偶然发现了一个我不理解的错误: * Occurs check: cannot construct the infinite type: a ~ [a] Expected type: [a] Actual type: [[a]] * In the expression: (addL x acc []) In the first argument of `foldl', namely `(\ x acc -> (addL x acc
* Occurs check: cannot construct the infinite type: a ~ [a]
Expected type: [a]
Actual type: [[a]]
* In the expression: (addL x acc [])
In the first argument of `foldl', namely
`(\ x acc -> (addL x acc []))'
至于我实际上想做的,是我想转置一个矩阵(下面提供的代码)。奇怪的是,如果我在Elm中运行代码(稍加调整),它就可以工作得很好。我需要一些帮助,因为我不明白我做错了什么
Elm代码:
trans matrix =
List.foldl (\x acc -> addL x acc []) [] matrix
addL x matrix solution =
case x of
[] -> solution
h::t -> case matrix of
[] -> addL t matrix (solution++[[h]])
h2::t2 -> addL t t2 (solution++[h2++[h]])
哈斯克尔代码:
trans matrix =
foldl (\x acc -> (addL x acc [])) [] matrix
addL x matrix solution =
case x of
[] -> solution
h:t -> case matrix of
[] -> (addL t matrix (solution++[[h]]))
h2:t2 -> (addL t t2 (solution++[h2++[h]]))
区别在于foldl
函数的语义。在Elm中,函数的签名为:
foldl : (a -> b -> b) -> b -> List a -> b
因此在Haskell中,累加器是第一个参数,第二个是列表的一个元素。在Elm,情况正好相反。因此,它可能应该与以下方面一起工作:
trans matrix =
foldl (\acc x -> (addL x acc [])) [] matrix
trans矩阵=
foldl(\acc x->(addL x acc[])[]矩阵
foldl
将累加器作为第一个参数,因此可能foldl(\acc x->…)…
All。方式。使用。输入签名!
trans matrix =
foldl (\acc x -> (addL x acc [])) [] matrix