2016-10-31 2 views
0

Ich habe die folgende Verwendung von foldl welche erroring:foldl Ausdruck nicht durch die Erstellung von wörtlichen verwenden

elementAt :: [a] -> Int -> a 
elementAt [] x = error "No empty lists for element-at" 
elementAt xs x = foldl(\acc (a, b) -> if(b == x) then a else acc) 0 $ zip xs [0..] 

Wenn ich versuche, und kompilieren ich diesen Fehler:

exercises.hs:8:67: error: * No instance for (Num a) arising from the literal 0' Possible fix: add (Num a) to the context of the type signature for: elementAt :: [a] -> Int -> a * In the second argument of foldl', namely `0' In the expression: foldl (\ acc (a, b) -> if (b == x) then a else acc) 0 In the expression: foldl (\ acc (a, b) -> if (b == x) then a else acc) 0 $ zip xs [0 .. ] Failed, modules loaded: none.

Antwort

5

Wenn Sie don Wenn Sie das Element nicht finden, lautet das Ergebnis Ihrer Funktion 0. Das macht nur Sinn, wenn Sie mit einer Zahlenliste arbeiten. Wenn Sie eine Liste von Zeichenfolgen übergeben und dann entweder eine Zeichenfolge aus der Liste oder die Zahl 0 zurückgeben, wäre das ein eindeutiger Typfehler.

So funktioniert Ihre Funktion nur mit Listen von Zahlen und Ihre Typ-Signatur muss dies widerspiegeln, indem Sie eine Num a Einschränkung hinzufügen.

Eine bessere Lösung wäre jedoch, 0 nicht als Standardwert zu verwenden und stattdessen Maybe zu verwenden. So müssen Sie sich nicht auf Nummernlisten beschränken.

Verwandte Themen