2

我正在用类型同义词替换我的一些库中的多参数类型类。一切都很顺利,直到我需要使用类型构造函数。此代码的最后两行不会编译。

{-# 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

4

1 回答 1

5

不应该是这样吗?

instance GridMap (LGridMap g v) where
  type BaseGrid (LGridMap g v) = g
  type Value (LGridMap g v) = v
于 2013-02-27T17:51:26.523 回答