2016-04-08 3 views
2

Ich versuche max'Fehler mit sehr einfacher Implementierung Liste Max Mit Falten

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

mit foldl zu implementieren (Leider LYAH nicht Übungen zu haben scheint, so mache ich sie nach oben).

Also, ich einen Lambda-Einnahme zweier ganzer Zahlen schreiben kann und die maximale Rückkehr:

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

und ich kann foldl eine Liste, um es mit:

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

So ging ich davon aus, dass, was ich brauche, ist :

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

Aber die obigen Zeilen nicht mit:

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 

Ich mag würde fragen:

  1. Was ist das Problem in diesem Fall ist?

  2. Wie kann ich zukünftige Fehler von Nachrichten dieses Typs herausfinden?

+4

Es ist kein Fehler, verwenden kann, ist es ein hlint Vorschlag sagen: „Ihre Umsetzung völlig in Ordnung ist, während sie verbessert werden kann von blah blah ". – zakyggaps

+0

@zakyggaps Ahhh, das macht jetzt so viel Sinn. Danke vielmals! –

Antwort

3

Hinweis Sie maximum nicht max sind Neuimplementierung, die Sie auch

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

Danke, obwohl ich mir dieser Funktion bewusst war. Es war nur zur Selbstverbesserung. –

+1

Oder wir könnten den Compiler-Vorschlag und diese Antwort kombinieren und "maximum" = folll1 max "ergeben. – jamshidh