2010-11-04 3 views
8

En Prolog, nous pouvons faire quelque chose comme ce qui suit:modèle correspondant à des variables équivalentes dans Haskell, comme dans Prolog

myFunction a (a:xs) = ... 

Ceci est, lorsque le 1er argument myFunction est le même que le premier élément de la liste C'est dans le 2ème argument, cette fonction évaluera à ....

Ma question est maintenant ... comment accomplir une chose similaire dans Haskell? J'ai l'idée que Pattern Matching de Prolog est plus expressif que celui de Haskell. J'ai essayé de coder cela dans Haskell et j'ai des problèmes - soit j'utilise une syntaxe invalide, soit le truc ci-dessus ne suffira pas.

Répondre

13

Haskell ne fait pas ce genre de "correspondance de variable". Vous devrez mettre explicitement un garde sur:

myFunction a (x:xs) 
    | x == a = ... 
8

Dans Haskell, vous ne pouvez pas faire des comparaisons implicites comme celui-ci dans un match de modèle. , Vous aurez besoin d'ajouter un garde qui ne explicitement la comparaison, comme si la place:

myFunction a (b:xs) | a == b = ... 
12

Haskell ne fait pas unification des variables, comme le fait Prolog. Comme le dit Haskell 98 report,

L'ensemble des modèles correspondant à chaque match doit être linéaire --- non variable peut apparaître plus d'une fois dans l'ensemble.

Vous pouvez de nom bien sûr les variables, et de l'état ils doivent aussi être égal:

f a (b:_) | a == b = ... 

Fait intéressant, Agda ne laisse à travers des modèles comme celui-ci, flux d'informations et introduit une notation spéciale f x (.x:_) pour dire que ce x doit être ce x.

+1

Dans scala, vous pouvez utiliser 'x' pour désigner un motif qui correspond également à la valeur d'une variable comme le cas Agda. –

Questions connexes