Семейства типов и конструкторы типов

Я работаю над заменой классов типов с несколькими параметрами в некоторых моих библиотеках синонимами типов. Все шло отлично, пока мне не понадобилось работать с конструктором типов. Последние две строки этого кода не скомпилируются.

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


person mhwombat    schedule 27.02.2013    source источник


Ответы (1)


Разве это не должно быть?

instance GridMap (LGridMap g v) where
  type BaseGrid (LGridMap g v) = g
  type Value (LGridMap g v) = v
person dave4420    schedule 27.02.2013