Pis*_*tor 4 haskell types functional-programming type-declaration
我正在尝试使用scanlHaskell 中的函数。我已经缩小了我的问题范围,可以在以下两种情况下描述,可以使用 Haskell 中的普通库在解释器中运行,该库包含(scanl请注意,我不一定对这里的 Monadic 值感兴趣,但只是如何用于scanl确保类型一致性):
为什么以下预先列出Right value的工作有效:
*Defs> scanl (\x acc -> x ++ acc) [] [[(Right 1)], [(Right 2)]]
[[],[Right 1],[Right 1,Right 2]]
Run Code Online (Sandbox Code Playgroud)
当这不起作用并导致以下错误消息时:
*Defs> scanl (\x acc -> [x] ++ acc) [] [(Right 1), (Right 2)]
<interactive>:36:35: error:
* Couldn't match expected type `[[a]]'
with actual type `Either a0 b0'
...
Run Code Online (Sandbox Code Playgroud)
我认为你已经交换了值和累加器。考虑以下类型scanl:
ghci> :t scanl
scanl :: (b -> a -> b) -> b -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)
累加器值的类型为b。它是第一位的。
如果您交换第二个示例中的参数,它会起作用:
ghci> scanl (\acc x -> acc ++ [x]) [] [(Right 1), (Right 2)]
[[],[Right 1],[Right 1,Right 2]]
Run Code Online (Sandbox Code Playgroud)
您还可以交换第一个示例的参数,这也有效:
ghci> scanl (\acc x -> acc ++ x) [] [[(Right 1)], [(Right 2)]]
[[],[Right 1],[Right 1,Right 2]]
Run Code Online (Sandbox Code Playgroud)