6

次のように型クラスを実装することは可能ですか:

class SomeClass e where
    isEq :: (SomeClass e') => e -> e' -> Bool

とがこの型クラスの同じインスタンスである場合、どこでisEq x ytrue を返しますか?xy

コンテキスト: これは、実行時の型テストを取得するための薄いベールに包まれた試みです。Haskell には型消去機能があることを最初に読みましたが、最近の GHC の拡張機能、そこに実行時の情報が含まれていることも読みました。

編集:私のユースケースについて疑問に思っている人のために...私は、タイプレベルのプログラミングを使用して、ADTの一部の特定のプロパティ、つまりリソー​​スの使用を保証しています。これらのリソースは個別のタイプで表されます (したがって、リソース ロックはタイプ レベルで実装されます)。

リソースの書き込み/読み取りの識別を必要とする最適化手順を作成しようとしています。しかし、私のすべてのリソースは個別のシングルトンで表されているため、その唯一の共通要素 (すべての値が下にあることを除く) は、それらをグループ化する型クラスです。

一言で言えば、型レベルのプログラミングの結果を実行時の値レベルで使用したいと考えています。

4

1 に答える 1

15

Karolis Juodelė が示唆しているように、次のようにしてこれを行うことができますData.Typeable

Prelude Data.Typeable> :{
Prelude Data.Typeable| let isEq :: (Typeable a , Typeable b) => a -> b -> Bool
Prelude Data.Typeable|     isEq x y = typeOf x == typeOf y
Prelude Data.Typeable| :}
Prelude Data.Typeable> isEq True ()
False
Prelude Data.Typeable> isEq True False
True

問題は、実行時に型が何であるかがわからないのはなぜですか。それから、それらが等しいかどうかを気にするのはなぜですか?ユースケースを詳しく説明できますか?

于 2013-01-24T10:23:38.290 に答える