ich Haskell neu bin so kann es offensichtlich sein, aber ich habe Prolog ausgiebig so bin ich über diese perplex ...Haskell Tupel nicht mit Funktionsargument passende
Wenn GHCi mit, habe ich die folgende Funktion (1):
Prelude> let find k t = head [v | (k',v) <- t, k == k'] -- Definiton of find
find :: Eq a1 => a1 -> [(a1, a)] -> a
Prelude> find 2 [(1,11),(2,22)] -- Invocation of find
22
Welche wird erwartet. Ich habe dann versucht, die k‘aus der Definition zu entfernen:
Prelude> let find2 k t = head [v | (k,v) <- t]
find2 :: t -> [(t1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
Ich war dann sehr überrascht, um den Wert zu sehen 2
angepasst tatsächlich mit 1
. Nur um sicherzugehen ich nicht das Unmögliche hatte gehofft, dass ich auch versuchen, die folgenden, um bestätigt, dass eine teilweise Übereinstimmung möglich ist, in Haskell, die aussieht wie es tatsächlich der Fall ist:
Prelude> head [v | (2,v) <- [(1,11),(2,22)]]
22
Ich habe auch bemerkt einen Unterschied in den Funktionsdeklarationen. Ich fügte die erforderlichen Informationen hinzu, so dass beide Deklarationen für find
und find2
genau gleich aussehen. Aber das Ergebnis ist immer noch kaputt (2,_)
(1,11)
matchnig:
Prelude> let find2 :: Eq a1 => a1 -> [(a1, a)] -> a; find2 k t = head [v | (k,v) <- t]
find2 :: Eq a1 => a1 -> [(a1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
Wie kann 2
werden passend 1
von jedem bedeuten?
(1) Die obige Funktion kommt aus dem ausgezeichneten Buch „Programming in Haskell“ S.93
Kurz gesagt: Prolog tut Vereinigung , Haskell macht nur Mustervergleiche. – chi
Langweiliger praktischer Rat: die Verwendung von "-Wall" wird sehr hilfreich sein, während Sie lernen (und auch um Probleme in echtem Code zu finden) – jberryman