2016-07-30 16 views
1

Ich lerne Haskell von learnyouahaskell.com und es ist ein Beispiel, so dass:Haskell Multi-line Lambdas

search :: (Eq a) => [a] -> [a] -> Bool 
search needle haystack = 
    let nlen = length needle 
    in foldl (\acc x - 
> if take nlen x == needle then True else acc) False (tails haystack) 

Aber wenn Sie diesen Code mit GHC versucht, es gibt mir

error: parse error on input ‘-’ 

Aber es funktioniert, wenn es so ist:

search :: (Eq a) => [a] -> [a] -> Bool 
search needle haystack = 
    let nlen = length needle 
    in foldl (\acc x -> if take nlen x == needle then True else acc) False (tails haystack) 

gibt es ein Merkmal von Haskell, die das som mehrzeiligen Lambda-Ausdrücke oder ist erlaubt Was fehlt mir?

+7

Sie mehrzeilige Lambda-Ausdrücke sind nicht zulässig. Sie teilen die Linie jedoch am schlechtesten Ort auf. Das '->' ist wichtig! behalte das und es sollte funktionieren. – pdexter

+1

brechen Sie einfach nicht Ihren Pfeil - halten Sie es zusammen '\ acc x ->' und einrücken Sie die nächste Zeile – Carsten

+2

Sie können nicht einen Zeilenumbruch in der Mitte von Wörtern oder Operatoren einfügen. – melpomene

Antwort

3

Sie die ->

einfach nicht brechen:

search :: (Eq a) => [a] -> [a] -> Bool 
search needle haystack = 
    let nlen = length needle 
    in foldl (\acc x -> 
if take nlen x == needle then True else acc) False (tails haystack) 

oder

search :: (Eq a) => [a] -> [a] -> Bool 
search needle haystack = 
    let nlen = length needle 
    in foldl (\acc x 
-> if take nlen x == needle then True else acc) False (tails haystack) 
+0

Wenn Sie die nächste Zeile einrücken, wird sie lesbar. – dfeuer