2016-11-30 218 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