我正在使用类型同义词替换某些库中的多参数类型类。在我需要使用类型构造函数之前,一切都很顺利。这段代码的最后两行不会编译。
{-# 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
我得到的编译错误是:
../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.
有更好的方法来定义LGridMap
吗?有没有办法指定LGridMap
是GridMap
的实例?
答案 0 :(得分:5)
不应该这样吗?
instance GridMap (LGridMap g v) where
type BaseGrid (LGridMap g v) = g
type Value (LGridMap g v) = v