Les règles de correspondance de motifs peuvent avoir de subtils effets sur la signification d’une fonction. Par exemple, considérons cette définition de take :
Code:
1 2 3
| take 0 _ = []
take _ [] = []
take n (x:xs) = x : take (n-1) xs |
et cette version légèrement différente (les deux premières équations ont été interverties) :
Code:
1 2 3
| take1 _ [] = []
take1 0 _ = []
take1 n (x:xs) = x : take1 (n-1) xs |
Maintenant notez ce qui suit :
Code:
1 2 3 4
| take 0 bot => []
take1 0 bot => ⊥
take bot [] => ⊥
take1 bot [] => [] |
nous voyons que take est « plus définie » concernant son deuxième argument, alors que take1 est plus définie concernant sont premier argument. Il est difficile de dire, dans ce cas, quelle définition est la meilleure. Rappelez-vous simplement que dans certaines applications, cela peut faire une différence. (Le Prélude Standard inclut une définition correspondante à take).