haskell - 代码在 Elm 中编译,但在 Haskell 中不编译

标签 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 []))'

至于我实际尝试做的是,我试图转置一个矩阵(下面提供了代码)。奇怪的是,如果我在 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]])

haskell 代码:
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 [elm-doc] 函数的签名是:

foldl : (a -> b -> b) -> b -> List a -> b

而在 Haskell 中, foldl [haskell-doc] 的签名是:
foldl :: (b -> a -> b) -> b -> [a] -> b

所以在 Haskell 中,累加器是第一个参数,第二个是列表的一个元素。在榆树中,情况正好相反。所以它可能应该与:
trans matrix =
  foldl (\acc x -> (addL x acc [])) [] matrix

关于haskell - 代码在 Elm 中编译,但在 Haskell 中不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50856706/

相关文章:

haskell - 在 Haskell 中打印元组内的值

c++ - 如何在opencv c++中有效清除 vector <Mat>

arrays - 已排序矩阵中的第 K 个最小元素

R应用保留属性的功能

list - 过滤列表 Haskell

haskell - 在哪里可以找到正确的 Haskell 包名称和版本?

haskell - 模式绑定(bind)中的单态性限制

r - R 中具有矩阵运算的 Margrittr 管道

javascript - 使用 compose 有什么好处?

list - 在 OCaml 的列表中查找唯一元素