2016-11-30 170 views
0

Haskell Wikibook提供一个正确实施foldl1

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没有足够的把握来进一步思考。有人可以帮我吗?

+5

定义“不起作用”。你是否遇到编译错误或运行时错误,或者它只是无法终止?您提供的代码在我的GHC上工作得非常好。 –

+0

与myFoldl1我得到一个编译错误“类型错误 - 统一会给infinte类型” – Tina

+0

嗯......这很奇怪。这是完整的错误信息吗?如果是这样,你使用的是哪种编译器? –

回答

5
mFoldl1 f (x:xs) = myFoldl1 f x xs 

你重命名功能时犯了两个错误:首先,你拼错在上述情况下的定义函数名(mFoldl1而不是myFoldl1),其次你更换调用foldl在原来用递归调用myFoldl1

正确的版本是:

myFoldl1 f (x:xs) = foldl f x xs 
+0

Thx对于你的回答,我已经在其他评论中解释过,我在另一台机器上发布了这个问题(一个平板电脑,我很快犯了错别字),而且不得不重新编写一些东西。我试图编辑它,但它始终显示我oriiginal后? – Tina

+7

@Tina请不要这样做。如果你重新输入代码(特别是容易出现拼写错误的方式),那么你只会让人们浪费他们的时间(和你的时间),专注于你的代码中实际不存在的错误。将来只需复制并粘贴机器上的代码,一旦你回到它的前面(这不像你之前需要答案,因为它们不会对你有任何用处片剂)。无论哪种方式,我敢打赌,至少我提到的第二个错误实际上存在于您的真实代码中。我发布的更正的代码绝对有效。 – sepp2k

1

我太跨错误绊倒在维基,发现该条目。

上面的答案似乎是错误的:它们甚至不是正确的类型。

foldl1 f [x]  = x 
fold11 f [x,y]  = f x y 
foldl1 f x:y:zs = f (f x y) (foldl1 f zs) 
foldl1 _ []  = error "foldl1 undefined on []" 

做的工作,我认为。我希望有更优雅的东西。

0

正确!以上的作品,但原来使用calll的呼叫是好得多。 混淆与字体不明确区分“l”和“1”!待清除

fold1 f (x:xs) = foldl f x xs 

是明显而简单的原创。

+0

你确定你不想编辑你的原始答案,而不是发布一个新的答案吗? – anonymoose