2011-05-11 4 views
8

Supposons que j'ai une expression de haskell comme:modèle Haskell correspondant à des cas symétriques

foo (Nothing, Just a) = bar a 
foo (Just a, Nothing) = bar a 

Y at-il syntaxe haskell à l'effondrement de ces cas, donc je peux correspondre soit à motif et spécifier bar a que la réponse à la fois? Ou est-ce à peu près aussi succincte que je peux l'obtenir?

+0

Voir aussi http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm

Répondre

5

C'est aussi succinct que ça se passe chez Haskell. Dans ML il y a une syntaxe pour ce que vous voulez (en écrivant plusieurs motifs, qui lient les mêmes variables, les unes à côté des autres, séparées par | avec le corps après le dernier motif), mais dans Haskell il n'y en a pas.

8

Si votre code est plus complexe que votre exemple, vous pouvez faire quelque chose comme ceci, en utilisant l'instance Alternative pour Maybe et l'extension PatternGuards (partie de Haskell2010).

{-# LANGUAGE PatternGuards #-} 
import Control.Applicative 

foo (x, y) | Just a <- y <|> x = bar a 

Si vous n'êtes pas familier avec elle, <|> choisit la plus à gauche Just s'il y a une et retourne Nothing autrement, ce qui provoque la garde de modèle à l'échec.

+2

une mise en garde importante si - cela correspond à plus de cas que l'original code. foo (Just x, Just y) serait apparié, donc si ce n'est pas ce que vous voulez, vous devrez vous assurer de le gérer dans un cas précédent. – mokus

4

Vous pouvez utiliser -XViewPatterns pour ajouter des fonctions arbitraires afin de réduire vos deux cas en un seul motif. Votre modèle est maintenant une fonction p qui donne la chose que vous voulez faire correspondre:

foo (p -> (Just a, Nothing)) = bar a 

beaucoup plus simple!

Nous devons définir p cependant, comme:

p (Nothing, [email protected](Just _)) = (a, Nothing) 
p [email protected](Just _, Nothing) = a 
p a      = a 

ou que vous souhaitez toutefois normaliser les données avant de regarder.


Références: Le GHC User's Guide chapter on View Patterns

Questions connexes