2014-01-15 3 views
5

VEC2は、データ宣言として働いているが、私は、このシナリオではタプルと私の決まり文句をスクラップしよう:ポリモーフィック型の同義語は、インスタンス内の多態性データ宣言のように機能しないのはなぜですか?

{-# LANGUAGE FlexibleInstances #-} 

type Vec2 a = (a,a) 

class Vector v where 
    foo :: v Integer 

instance Vector Vec2 where 
    foo = (1,2) 
+2

あなたは部分的に型シノニムを適用することはできません。http://www.haskell.org /pipermail/glasgow-haskell-users/2005-April/008340.html。場合によっては、型シノニムを部分的に適用することもできますが、この場合は不可能です。 – user2407038

+2

エラーメッセージを含めます。ところで、問題の内容を正確に伝えています。 – Carl

答えて

5

型シノニムは、部分的に適用することはできません。本質的に型レベル関数であるため、部分的に適用される型同義語の間の等価性を決定することは、等価等価性を決定することと似ています。

あなたはStringが完全に適用されているので

{-# LANGUAGE FlexibleInstances #-} 
instance Foo String where 
    ... 

ような何かをするためにあなたの力の範囲内に十分です。仕事の周りには、種類がカリー化されているので、いくつかのケースでは、あなたが

type Arr = ((->) Int) 

のようなものを書くことができ、型シノニムは、「完全に適用」されるので、このためにインスタンスを作成し、しかし、があります。

あなたがのnewtypeを使用する必要があるとしているので、巧妙なETAの変換はできません。この場合、

newtype SimplePair a = SimplePair {unSimplePair :: (a, a)} 
関連する問題