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
?