2017-03-01 17 views
3

次のことを考えてみましょう:部分的に適用された等式制約

class (a ~ b) => Equal a b 
instance (a ~ b) => Equal a b 

は、私は後でデータ型考えてみましょう:

data D (c :: * -> Constraint) where 
    D :: Proxy c -> D c 

を次に、このようなものが有効である:

D (Proxy :: (Proxy (Equal Int))) 

私の質問私が使った繰返しクラス/インスタンス表記以外のEqualを書く方法はありますか?

タイプファミリとしてEqualを定義すると、Equal Intは不完全なアプリケーションなので動作しないようです。

クラス/インスタンスのハックは悪く見えますが、少なくとも動作しますが、これを達成するための他の多分もっとクリーンな方法がありますか?

注意実際のコードでは等価よりも複雑な制約を使用していますが、これは良い例だと思っています。

+0

私は 'Proxy((〜)Int)'はうまくいかないかもしれないと思う。 – chi

答えて

4

クラスはまったく必要ありません。接頭辞表記には(~)を使用できます。

GHC 8.0.1にバグがあり、クラッシュすることがありますが、バグであり、8.0.2で修正されています。あなたが記述しているクラス/インスタンスの組み合わせは、実際にはこのバグに対する効果的な回避策です。

8.0.1との下位互換性が必要ない場合は、(~) IntまたはProxy ((~) Int)を直接使用できます。

関連する問題