2013-02-27 6 views
2

Je travaille sur le remplacement de classes de types multi-paramètres dans certaines de mes bibliothèques avec des synonymes de type. Tout allait bien jusqu'à ce que je devais travailler avec un constructeur de type. Les deux dernières lignes de ce code ne compileront pas.Familles de types et constructeurs de types

{-# LANGUAGE TypeFamilies, FlexibleContexts #-} 

import qualified Data.Map as M 

-- | A regular arrangement of tiles. 
class Eq (Index g) => Grid g where 
    type Index g 
    -- | Returns the indices of all tiles in a grid. 
    indices :: g -> [Index g] 
    -- plus other functions 


-- | A map from tile positions in a grid to values. 
data LGridMap g v = LGridMap { toGrid :: g, toMap :: M.Map (Index g) v } 

instance Grid g => Grid (LGridMap g v) where 
    type Index (LGridMap g v) = Index g 
    indices = indices . toGrid 


class GridMap gm where 
    type BaseGrid gm 
    type Value gm 

instance GridMap (LGridMap g v) where 
    BaseGrid gm = g -- line 26 
    Value = v  -- line 27 

L'erreur de compilation que je reçois est:

../Amy.hs:26:3: 
    Pattern bindings (except simple variables) not allowed in instance declarations 
     BaseGrid gm = g 

../Amy.hs:27:3: 
    Pattern bindings (except simple variables) not allowed in instance declarations 
     Value = v 
Failed, modules loaded: none. 

Y at-il une meilleure façon de définir LGridMap? Existe-t-il un moyen de spécifier que LGridMap est une instance de GridMap?

Répondre

5

Cela ne devrait-il pas être cela?

instance GridMap (LGridMap g v) where 
    type BaseGrid (LGridMap g v) = g 
    type Value (LGridMap g v) = v 
Questions connexes