si j'ai somthing comme ça:s'il vous plaît aidez-moi à comprendre le match de modèle en haskell. Je suis un peu confus
func (x1:x2:x3:xs) = xs
alors x1,x2,x3
doit exister, oui?
ils ne peuvent pas être []
, mais doivent (encore, DOIVENT) être avec une valeur, oui?
également, le xs
peut être []
ou [a]
ou [a,a,a]
(etc '), oui?
(en [a]
je veux dire que c'est une liste avec un nombre, et [a,a,a]
est la liste de trois nombres).
aussi i ont une fonction qui définissent isPrefixOf:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` [] = True
[] `myIsPrefixOf` (x:xs) = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
si je retire le premier motif, que la fonction ressemblera à ceci:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` (x:xs) = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
et maintenant je vais écrire:
[] `myIsPrefixOf` []
Je vais avoir: Faux (ça devrait être vrai).
est parce que le premier motif a dans son élément latéral droit: (x:xs)
, et à cause de cela, x
doit être avec une valeur, donc passer i à travers le premier motif, et obtenir au second motif:
list `myIsPrefixOf` [] = False
qui correspond, et retourne False.
ai-je raison? Si j'ai raison, alors la différence est que si j'écris (x:xs)
, DOIT être une valeur et NON []
.
d'autre part, si j'écris list
, il peut être match contre []
et [a]
et [a,a,a]
(etc), et à cause de cela, list
du second motif, correspondra au premier []
dans mon entrée, et donc je vais avoir faux?
(comme précédemment, dans [a]
je veux dire que c'est une liste avec un nombre, et [a,a,a]
est la liste de trois nombres).
également, pour corriger cette situation, je dois remplacer:
[] myIsPrefixOf
(x:xs) = True
avec qui:
[] `myIsPrefixOf` list = True
et maintenant les expressions:
[] `myIsPrefixOf` []
[] `myIsPrefixOf` [1,2,3]
seront les deux agains match:
[] `myIsPrefixOf` list = True
J'espère avoir raison sur ces choses, et maintenant pour une autre question:
est ici la fonction fixe dès le départ (après application des modifications)
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` list = True
list `myIsPrefixOf` [] = False
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
maintenant, si je retire le deuxième match de motif, que la fonction ressemblera à ceci:
myIsPrefixOf :: (Eq a) => [a] -> [a] -> Bool
[] `myIsPrefixOf` list = True
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
et appel la fonction comme ça:
[1,2] `myIsPrefixOf` [1]
Je reçois une erreur disant qu'il n'y a pas de motifs exhaustifs dans la fonction.
Je veux voir si je comprends pourquoi cela se passe.
la fonction passer à travers le premier motif et le second arriver à une:
(l:ls) `myIsPrefixOf` (x:xs) = if l == x then ls `myIsPrefixOf` xs
else False
si:
[1,2] `myIsPrefixOf` [1]
et:
l == x
.
ils ont tous deux 1
, donc je correspondent à nouveau le second motif:
(2:[]) `myIsPrefixOf` ([]:[])
maintenant, l == 2
, mais x == []
et parce que, l'expression: l == x
renvoie la non-exhaustive modèle ...
est parce que j'essaie de vérifier l'égalité entre un nombre et une liste?
le paramètre d'égalité (==) devrait vérifier seulement les éléments qui sont dans le même type?
(à savoir: 'a' == 'b'
ou 1 == 3
) bien
, ce que je comprends tout droit? :-)
merci beaucoup :-).
Haskell est-il votre premier langage de programmation fonctionnel? J'aime Haskell, mais beaucoup des idées de base qu'il utilise sont plus faciles à comprendre dans d'autres langues plus simples. En Lisp, '(liste 1 2 3)' est vraiment '(contre 1 (contre 2 (contre 3 nil)))'; dans ML, '[1,2,3]' est vraiment '1 :: 2 :: 3 :: nil'; La construction de la liste de Haskell suit cette tradition fonctionnelle, et donc [1,2,3] 'est vraiment' 1: 2: 3: [] '. – ephemient
c'est mon premier, oui :-). – Elimelech
Super, j'espère que vous continuez sur votre chemin vers l'illumination fonctionnelle :-) – ephemient