2016-07-21 13 views
2

私は、次のようなコードがある場合は、スタンドアロン作ったときに動作し、失敗しましたエラーのような単純な変数ではないはずです。関連するタイプの家族は

しかし、私は単純に次のようなコードを再編成することができます

type family T t1 t2 

class C where 
    ... 

type instance T (X t) (t a b) = a 

instance C (X t) where 
    .... 

そして、すべてが今正常に動作するようです。

多少複雑な構文なので、ファミリ定義をクラスから取り除くことで何かを失うのですか、クラス内の定義は構文的な砂糖なので、それを取り出すのは比較的コストがかからない回避策ですか?

+1

'クラスC 'のパラメータは何ですか?それが重要かもしれないと思います。 – chi

+0

私の理解は、現在のところ、関連するタイプのファミリーはかなり構文的な砂糖です。私は本当に彼らがそのように追加されるべきであると確信していない。 – dfeuer

答えて

4

どのクラスKのパラメータでありt1,t2すべての変数この

type family T t1 t2 
type instance T (X t) (t a b) = a 

は大体この

class K t1 t1 where 
    type T t1 t2 
instance K (X t) (t a b) where 
    type T (X t) (t a b) = a 

ノートのように動作します。変数が複数回発生した場合 は確かに、これは、投稿エラー状態として、(すなわち、非直線的に)必要とされています

• Polymorphic type indexes of associated type ‘T’ 
    (i.e. ones independent of the class type variables) 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    must be distinct type variables 

だから、どちらかあなたのクラスに、これらすべての型変数を追加、または - 同じにエフェクト - クラスの外でタイプファミリを移動します。


これはGHC 8.0でコンパイルされます。

{-# LANGUAGE TypeFamilies, PolyKinds #-} 

data X (t :: k) = X 

class C t1 where 
    type T t1 t2 

instance C (X (t :: * -> * -> *)) where 
    type T (X t) (t a b) = a 
関連する問題