2012-06-29 12 views
6

Sto tentando di implementare la Funcmap fmap su Data.Map.Map, ma sto ricevendo un errore. Sono sicuro di non aver bisogno di convertire la Mappa in e da una Lista per far funzionare tutto questo, ma questo è il migliore che ho trovato finora."Nessuna istanza per (Ord k)" durante l'implementazione di Functor su Data.Map.Mappa

class Functor' f where 
    fmap' :: (a -> b) -> f a -> f b 

instance Functor' (Map.Map k) where 
    fmap' f m 
     | Map.null m = Map.empty 
     | otherwise = let x:xs = Map.toList m 
          mtail = Map.fromList xs 
          a = fst x 
          b = snd x 
         in Map.insert a (f b) (fmap f mtail) 

L'errore:

No instance for (Ord k) 
    arising from a use of `Map.fromList' 
In the expression: Map.fromList xs 
In an equation for `mtail': mtail = Map.fromList xs 
In the expression: 
    let 
    x : xs = Map.toList m 
    mtail = Map.fromList xs 
    a = fst x 
    .... 
    in Map.insert a (f b) (fmap f mtail) 

Tutte le idee?

+3

Basta mettere 'Ord' nel giusto contesto:' esempio Ord k => Functor'(Map.Map k) WHERE'. – JJJ

+0

Bello, grazie! C'è un modo migliore di convertire da e verso un elenco? – pyrospade

+0

Sì, c'è un modo migliore per scrivere 'fmap' per' Functor (Mappa k) 'senza usare elenchi e il vincolo' Ord k' affatto. Ecco come funziona 'Data.Map.map' (==' fmap' per 'Mappa k'): http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.4.2.1/ src/Data-Map.html # map. Ma se vuoi usare 'toList' /' fromList', qualcosa come 'fmap 'f = Map.fromList. mappa (seconda f). Map.toList' sarebbe più semplice ('second' è di' Control.Arrow'). – JJJ

risposta

2

L'errore è dovuto all'impossibilità di assegnare il predicato Ord alla variabile di tipo k. Basta fare questo:

instance Ord k => Functor' (Map.Map k) where