2012-03-08 10 views
8

基本的には、{-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-}(必要に応じて以上)を指定すると、タイプレベルの演算子Constraintのタイプレベルの式に対して(~)が動作しますか?私は答えをグーグルで試したが、運がなかった。制約の等価性

+1

質問は奇妙ですが、よく尋ねられます。好奇心の中で、あなたは拘束平等で何をしますか? –

+0

@Daniel Wagner私は、ジェネリック関数システムを使用するクロスパラダイムEDSLを書いています。さまざまな理由から、タイプクラスを直接使用することはできません。私はこれを使わないと逃げることができますが、それは非常にぎこちないタイプになり、おそらくいくつかの不必要な制限につながります –

答えて

6

はい、可能です。種類の種類Constraintは原子型制約の有限集合であるため、それらの等価性を非常に簡単にテストできます。

PolyKinds拡張は必要ありません。また、多態性制約を引数として渡すという実用的な方法がないので、この種の等式が実際に役立つ状況はほとんどありません。したがって、制約等式はすべての場合に同値化されます(Show ~ Showここをクリック):

{-# LANGUAGE ConstraintKinds, TypeFamilies #-} 

type Bla c1 c2 a = (c1 a, c2 a, c1 ~ c2) 

foo :: Bla Show Show a => a -> IO() 
foo = print 

main = foo "Bla"