desidero definire quanto segue typeclass Mapping
:Haskell: classi tipo di domanda
{-# LANGUAGE MultiParamTypeClasses #-}
class Mapping k v m where
empty :: m v
insert :: k -> v -> m v -> m v
search :: k -> m v -> Maybe v
delete :: k -> m v -> m v
Un esempio di Mapping
è Data.Map.Map
{-# LANGUAGE ..., FlexibleInstances #-}
instance Ord k => Mapping k v (Map.Map k) where
empty = Map.empty
search = Map.lookup
insert = Map.insert
delete = Map.delete
E ora voglio creare un tipo Trie :: * -> * -> * -> *
come
{-# LANGUAGE ..., UndecidableInstances #-}
data Trie m k v = Trie {
trValue :: Maybe v,
trChildren :: m (Trie m k v)
}
instance Mapping k (Trie m k v) m => Mapping [k] v (Trie m k) where
search [] tree = trValue tree
search (x:xs) tree =
search xs =<< search x (trChildren tree)
Fin qui tutto bene, ora voglio anche definire insert
Trie
, ed è lì che ho problemi.
discuterò empty
perché è più semplice e insert
ne ha bisogno in ogni caso .. Se provo questo:
instance Mapping k (Trie m k v) m => Mapping [k] v (Trie m k) where
empty = Trie { trValue = Nothing, trChildren = empty }
...
e che mi fa ottenere il seguente errore:
Could not deduce (Mapping k (Trie m k1 v) (m k1))
from the context (Mapping [k1] v (Trie m k1),
Mapping k1 (Trie m k1 v) (m k1))
arising from a use of `empty' at test.hs:27:49-53
Possible fix:
add (Mapping k (Trie m k1 v) (m k1)) to the context of
the instance declaration
or add an instance declaration for (Mapping k (Trie m k1 v) (m k1))
In the `trChildren' field of a record
In the expression: Trie {trValue = Nothing, trChildren = empty}
In the definition of `empty':
empty = Trie {trValue = Nothing, trChildren = empty}
ho provato e provato a risolverlo ma fallito.
Qualcuno sa come farlo funzionare? È possibile?
BTW, suggerisco di rimuovere 'v' dalla definizione della classe di tipi (ma lascialo nelle firme dei metodi). Non ne hai bisogno, almeno per tutte le strutture che hai dato finora, perché prenderanno qualsiasi tipo di contenuto e renderà tutto più semplice. –