Ich verstehe, dass it's impossible to pattern match functions in Haskell, und ich verstehe voll und ganz warum. Ich habe jedoch zwei eng verwandte Fragen. Erstens, in Fällen, in denen Sie Funktionen zur späteren Verwendung teilweise anwenden möchten, gibt es eine Möglichkeit, die Rückgabe zu definieren und zu erfassen, wenn es sich um ein Tupel handelt? Oder liege ich falsch, und das versucht immer noch, Funktionen unter meiner Nase zusammenzufassen?Gibt es eine Möglichkeit, ein Tupel von Funktionen höherer Ordnung in Haskell zu erfassen?
Angenommen, ich versuche, den Quotienten und den Rest eines Wertes mit verschiedenen Vielfachen von zehn zu erhalten. Wie würde ich dann so etwas schreiben?
q, r :: Integral a => a -> a
(q, r) = (12345 `quotRem`)
Mir ist klar, hier gibt es getrennte Funktionen, die vorhanden sind, so konnte ich diese stattdessen tun:
q, r :: Integral a => a -> a
q = (12345 `quot`)
r = (12345 `rem`)
Allerdings, das ist ein sehr spezifischer Fall, und es gibt unbegrenzte andere Beispiele von Funktionen, die Rückkehr Tupel, die man verallgemeinern könnte. Zum Beispiel eine Funktion, die die Anzahl der Evens und Odds in einer Liste zurückgibt.
evens, odds :: Integral a => [a] -> Int
(evens, odds) = (length . (filter even), length . (filter odd))
Dies führt mich zu meiner zweiten Frage. Das obige funktioniert in GHCi gut.
Prelude> let (evens, odds) = (length . (filter even), length . (filter odd))
Prelude> :t evens
evens :: Integral a => [a] -> Int
Prelude> evens [1..10]
5
Was ist noch verwirrender ist es funktioniert sogar durch „Pattern-Matching“ in der gleichen Art und Weise, die ich mit (q, r)
am Anfang gespielt wurde:
Prelude> let evensOdds = (length . (filter even), length . (filter odd))
Prelude> :t evensOdds
evensOdds :: (Integral a1, Integral a) => ([a1] -> Int, [a] -> Int)
Prelude> let (ev,od) = evensOdds
Prelude> :t ev
ev :: Integral a1 => [a1] -> Int
Prelude> ev [1..10]
5
Es funktioniert auch ganz gut in einem tatsächlichen Datei in GHCi geladen, auch wenn (evens, odds)
nicht. Warum sind diese beiden verschieden und warum arbeitet die zweite überhaupt in GHCi, wenn sie nicht normal funktioniert? Kann das, was hier anders ist, irgendwie genutzt werden?