Salut,
J'essaye de faire l'algorithme A* en Haskell pour m'entraîner. Dans cet algorithme on a "besoin" de piles. Du coup, je fais un mini module qui implémente celles ci en Haskell. Le souci c'est que mes types sont paramétrés (e.g. PriorityQueue Int
ou FIFOQueue String
, etc…) et que je bloque un peu sur la syntaxe des instances de ma typeclass Queue
. Voici le code (complet):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | module Data.Queue ( Queue, FIFOQueue, LIFOQueue, Deque, PriorityQueue ) where import Data.List (maximumBy) class Queue q where get :: q a -> a put :: a -> q a -> q a data FIFOQueue a = FIFOQueue [a] deriving (Show, Eq) data LIFOQueue a = LIFOQueue [a] deriving (Show, Eq) data Deque a = Deque [a] deriving (Show, Eq) data PriorityQueue a = PriorityQueue [(a, Float)] deriving (Show, Eq) instance Queue (FIFOQueue a) where get (FIFOQueue xs) = FIFOQueue $ head xs put elt (FIFOQueue xs) = FIFOQueue $ elt : xs instance Queue (LIFOQueue a) where get (LIFOQueue xs) = LIFOQueue $ head xs put elt (LIFOQueue xs) = LIFOQueue $ xs ++ [elt] instance Queue (Deque a) where get = popLast put elt (Deque xs) = Deque $ elt : xs popLast, popFirst :: Deque a -> a popLast (Deque xs) = Deque $ init xs popFirst (Deque xs) = Deque $ tail xs instance Queue (PriorityQueue a) where get (PriorityQueue xs) = maximumBy $ (compare . snd) xs put elt (PriorityQueue xs) = PriorityQueue $ elt : xs |
… et voici l'erreur du compilateur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Data\Queue.hs:20:17: The first argument of `Queue' should have kind `* -> *', but `FIFOQueue a' has kind `*' In the instance declaration for `Queue (FIFOQueue a)' Data\Queue.hs:24:17: The first argument of `Queue' should have kind `* -> *', but `LIFOQueue a' has kind `*' In the instance declaration for `Queue (LIFOQueue a)' Data\Queue.hs:28:17: The first argument of `Queue' should have kind `* -> *', but `Deque a' has kind `*' In the instance declaration for `Queue (Deque a)' Data\Queue.hs:36:17: The first argument of `Queue' should have kind `* -> *', but `PriorityQueue a' has kind `*' In the instance declaration for `Queue (PriorityQueue a)' |
Quelle syntaxe devrai-je écrire ?
Merci d'avance,
AZ.
PS: ça n'a rien à voir, mais je viens de terminer un 2048 en mode console, j'aimerais le porter en mode graphique. Vous me conseillez quelle librairie graphique ?
+0
-0