【发布时间】:2016-11-30 17:36:55
【问题描述】:
Haskell Wikibook 提供一个
foldl1 :: (a -> a -> a) -> [a] -> a
foldl1 f (x:xs) = foldl f x xs
foldl1 _ [] = error "Prelude.foldl1: empty list"
那行不通。我试图编译它的这个版本:
myFoldl1 :: (a -> a -> a) -> [a] -> a
mFoldl1 f (x:xs) = myFoldl1 f x xs
myFoldl1 _ [] = error "Prelude.foldl1: empty list
我首先认为它缺少一个结束折叠的案例,并且打字有问题
foldl1 _ [x] = x
foldl1 f (x:xs) = foldl (f x) xs
但这也行不通。我认为类型问题更深入,但我对 Haskell 的理解不够好,无法进一步思考。有人可以帮我吗?
【问题讨论】:
-
定义“不起作用”。您是否收到编译错误或运行时错误,或者它只是无法终止?您提供的代码在我的 GHC 上运行良好。
-
使用 myFoldl1 我得到一个编译错误“类型错误 - 统一会给出无限类型”
-
嗯...我不确定。我很确定代码的第一个 sn-p 是正确的。你还有什么不寻常的事情吗?
-
myFoldl1是什么?你用这个名字发布的内容中没有任何内容。您应该包含您编写的实际导致错误的代码,而不是您认为您复制正确的代码! -
您刚刚编辑的帖子不正确。将
foldl1改回foldl看看它是否有效。
标签: haskell fold higher-order-functions