14

のようなことは可能ですか?

class T a
class U a
instance U ()
instance ( NOT U a ) => T a

コンテキスト: HListを取り、特定の型 (ここではユニット型) の要素を削除する関数を作成しようとしています。

オープンワールドの仮定に問題があるように感じますが、ハードコードされた方法で( NOT U a ではなく、 NOT a~() のようなもので)それを行うことさえ可能に見えるはずです。

編集: CA McMann のコメントで指摘されているように、この質問は私のものとほとんど同じです。モデレーターがこれを閉じたいと感じた場合は、お気軽に。

4

1 に答える 1

11

ハックに関する独自のライブラリを持っているオレグのトリックを使用してそれを行うことができます

型クラス システムを悪用することで、Fundep を生成することができます。

class TypeEq a b result | a b -> result

そのようなTypeEq a b True場合のみa~bTypeEq a b Falseそうでない場合

だからあなたは書くことができます

instance (TypeEq () a False) => T a

そして、それはうまくいくはずだと思います。はっきりさせておきたいのですが、この型の等価性テストは、その実装方法において純粋に悪ですが、ほとんどの場合うまくいきます。これがどのように機能するか/一般化する方法を理解したい場合は、そのライブラリのコードを確認してください (HList の論文も読んでください)。

やりたいことを否定的な制約なしで行うことができる場合は、代わりにそれを行います。

于 2012-12-19T11:00:13.577 に答える