Comment puis-je créer un opérateur en Haskell?
Faire un ternaires de la logique de la table, et je voudrais faire ma propre fonction pour un opérateur que je vais appeler <=>
.
Ainsi, par exemple, je veux faire cela, mais ce n'est pas le bon. quelle est la manière correcte de le faire?
data Ternary = T | F | M
deriving (Eq, Show, Ord)
<=> :: Ternary -> Ternary -> Ternary
<=> T F = F
<=> T T = T
<=> T M = M
<=> F F = T
<=> F T = F
<=> F M = M
<=> M F = M
<=> M T = M
<=> M M = T
- Tout comme une note de côté,
M <=> M
devrait êtreM
plutôt queT
. Mais cela dépend de votre "Peut-être" de la sémantique. - N'oubliez pas que vous pouvez définir arité et associativité des opérateurs en utilisant
infixl
,infixr
...
Vous devez vous connecter pour publier un commentaire.
Juste ajouter des parenthèses autour de votre opérateur:
Ce qu'il transforme à partir de la forme infixe de forme préfixe. Alternativement, vous pouvez simplement utiliser infix dans la définition:
:
opérateur cons? Le:
opérateur cons a cette particularité, lorsqu'il estime tout sur le côté droit de la liste. J'ai essayé de recréer le:
de l'opérateur, mais il nécessite toujours entre parenthèses, sur le côté droit.infix
ainsi?data List a = Nil | a :- List a
et puis la partie cruciale:infixr 5 :-
. N'a pas à être 5, mais qui est la priorité des listes, vient d'êtreinfixr
et PASinfixl
ouinfix
.infixl 9
est la valeur par défautLes noms de fonction avec les symboles ont une syntaxe différente que ceux sans:
Je vous promets, si - Haskell est bien la peine d'apprendre les règles complexes.
a `letters` b
fonctionne ...Vous pouvez simplifier (ligne-sage) de la définition comme suit:
(line-wise)
là. La clarté est discutable si. Je peux voir le code mieux parce que je suis forcé d'en déduire ce qu'il fait réellement, par opposition à la recherche d'un raw tableaux de définition. Mais c'est moi.M <=> M
êtreT
partie.Puisque vous avez
Eq
etOrd
, vous pouvez effectuer les opérations suivantes:Si vous ne vous arrive de le modifier de sorte que
M <=> M == M
, vous pouvez effectuer les opérations suivantes: