Salut,
Etant en apprentissage depuis deux jours de Haskell, je me raccroche à mes habitudes de programmation en d'autres langages, principalement Python. Je suis donc habitué aux langages orientés objet, donc signalez moi si vous voyez une erreur de conception ou une architecture/vocabulaire non adapté au paradigme fonctionnel. Voici mon problème: j'essaie de définir un type de donnée dont on pourrait ajouter les instances avec l'opérateur classique +
. Plus précisément, j'ai un type de donnée Position
et un autre Direction
.
Ils sont définis comme suit:
1 2 3 4 5 6 7 | data Position = Position { x :: Int, y :: Int } deriving Show -- North | South | East | West data Direction = N | S | E | W deriving Show |
Maintenant j'aimerais que si je tape Position { x = 5, y = 6 } + N
, j'obtienne Position { x = 5, y = 5 }
.
J'ai essayé tout simplement de définir l'opérateur `(+)' avec la signature (+) :: Position -> Direction -> Position:
1 2 3 4 5 | position + direction = case direction of N -> Position { x = x position, y = y position - 1 } S -> Position { x = x position, y = y position + 1 } E -> Position { x = x position + 1, y = y position } W -> Position { x = x position - 1, y = y position } |
Evidemment Haskell me dit que c'est ambigu entre Prelude.+ et Tool.+ (Tool est le nom du module dans lequel sont définis mes types de donnée).
Je cherche donc un moyen de pallier à cette ambiguïté,
Merci d'avance,
AZ.
PS: Quel outil ZdS utilise-t-il pour la coloration syntaxique ? La "palette" des langages m'a l'air très étendue, en tout cas plus que celle d'OpenClassrooms