2016-04-08 42 views
2

我試圖用foldl實現max'誤差非常簡單的實現列表中最大使用折

max' :: (Ord a) => [a] -> a 

(可悲的是,LYAH似乎並不具備練習,所以我讓他們起來)。

所以,我可以寫一個lambda採取兩個整數並返回最大:

(\x y -> if x > y then x else y) 2 3 

,我可以foldl列表使用它:

foldl (\x y -> if x > y then x else y) 2 [2, 3, 4, 1] 

所以我認爲我需要的是:

max' :: (Ord a) => [a] -> a 
max' xs = foldl (\x y -> if x > y then x else y) (head xs) (tail xs) 

但是,上述行失敗:

Use foldl1 
Found: 

foldl (\ x y -> if x > y then x else y) (head xs) (tail xs) 
Why Not: 

foldl1 (\ x y -> if x > y then x else y) xs 

我想問:

  1. 什麼是在這種情況下,這個問題?

  2. 如何從這種類型的消息中找出未來的錯誤?

+4

這不是一個錯誤,這是一個hlint建議說:「你的實現是完全罰款,同時可以提高通過等等「。 – zakyggaps

+0

@zakyggaps啊,現在這很有道理。非常感謝! –

回答

3

注意你重新實現maximum不是最大,它可以使用,以及

foldl max (head xs) (tail xs) 


Prelude> :info max 
class Eq a => Ord a where 
    ... 
    max :: a -> a -> a 
    ... 
     -- Defined in `GHC.Classes' 

Prelude> :info maximum 
maximum :: Ord a => [a] -> a -- Defined in `Data.List' 
+0

謝謝,雖然我知道這個功能。這只是爲了自我改進。 –

+1

或者,我們可以結合編譯器建議和這個答案,產生'最大'= foldl1 max'。 – jamshidh