Ich lerne Haskell. Dies ist ein triviales Beispiel, aber ich würde gerne das Konzept verstehen, warum ich den Mustervergleich in der Lambda-Funktion im folgenden Beispiel nicht verwenden kann (dh warum führt die Filterfold-Funktion, aber Filterfold, einen Laufzeitfehler aus):Muster passend in Lambda
-- Runs
filterfold' :: (a -> Bool) -> [a] -> [a]
filterfold' p zs = foldr (\y zs -> if (p y) then y:zs else zs) [] zs
-- Runtime error: Non-exhaustive patterns in lambda
filterfold :: (a -> Bool) -> [a] -> [a]
filterfold p (z:zs) = foldr (\y (z:zs) -> if (p y) then y:(z:zs) else (z:zs)) [] (z:zs)
Also, das ZS aus dem Argument der Filterfold-Funktion ist im Geltungsbereich, aber anstatt das 'z' aus dem Filterfold zu verwenden, versucht es, einen Mustervergleich lokal innerhalb des Lambda durchzuführen? – Daniel
ja die 'z' und' zs' innerhalb des Lambdas werden verschiedene sein ('foldr' wird * ihnen * zur Verfügung stellen) - deshalb sollten Sie Parameter/Argumentnamen für Lambda-Argumente nicht wiederverwenden - Sie * führen * diese Namen mit ein dein Lambda und du wirst das Einmalige aus dem Outer-Scope verstecken - also wenn du das 'z' und' zs' aus dem Outer-scope in 'filterfold' verwenden willst, solltest du es einfach in' foldr (\ y) umbenennen ys -> ...) '(oder welcher Name auch immer anders ist als' p', 'z',' zs' und 'y';)) – Carsten
aber bitte beachten Sie: wenn Sie das zweite Argument von Funktion (das Lambda), die du zu "foldr" gibst, dann brauchst du wahrscheinlich nicht den 'foldr' an erster Stelle, da du nur auf den" Kopf "der Liste eingibst, wenn er nicht leer ist oder auf den zweiten Standard geht Argument von 'foldr' – Carsten