Je suis nouveau à Haskell il peut être évident, mais je l'ai fait Prolog longuement donc je suis perplexe sur celui-ci ...Haskell tuple ne correspond pas à l'argument de la fonction
Lorsque vous utilisez GHCi, j'ai créé la fonction suivante (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
Ce qui est attendu. J'ai ensuite essayé d'enlever le k » de la définition:
Prelude> let find2 k t = head [v | (k,v) <- t]
find2 :: t -> [(t1, a)] -> a
Prelude> find2 2 [(1,11),(2,22)]
11
j'étais alors très surpris de voir la valeur 2
fait en correspondance avec 1
. Juste pour être sûr que je n'espérais pas l'impossible, j'essaie également les éléments suivants pour confirme que la correspondance partielle est possible dans Haskell, qui ressemble il est en fait le cas:
Prelude> head [v | (2,v) <- [(1,11),(2,22)]]
22
J'ai aussi remarqué une différence dans les déclarations de fonction. J'ai ajouté les informations requises afin que les deux déclarations pour find
et find2
se ressemblent exactement. Mais le résultat est encore cassé (2,_)
matchnig (1,11)
:
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
Comment 2
une correspondance des 1
par tout moyen?
(1) La fonction ci-dessus provient de l'excellent livre "Programmation en Haskell" p.93
En bref, Prolog-t unification , Haskell ne fait que l'appariement. – chi
Conseil pratique ennuyeux: l'utilisation de '-Wall' sera vraiment utile pendant que vous apprenez (ainsi que pour attraper les problèmes en code réel) – jberryman