键入族和类型构造函数

时间:2013-02-27 17:47:42

标签: haskell type-families

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

{-# 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吗?有没有办法指定LGridMapGridMap的实例?

1 个答案:

答案 0 :(得分:5)

不应该这样吗?

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