私は、完全にタイプセーフな AST のために GADT などを使用して、Haskell で完全に型指定された DSEL を作成して遊んでいます。正しく型指定されたコンパイラを実行するには、Haskell 型から型と値の両方 (型付き環境) へのマップなどの構造が必要なようです。など、Haskell の型システムで理解できます。C++ には、これらのような構造 (型->値マップ、型付き値のベクトルなど) を備えた Boost.Fusion ライブラリがあります。Data.Tuple はシーケンスを処理しますが、Boost.Fusion などmap
の Haskell バージョンはありますか?
4 に答える
dependent-mapパッケージを見てください。私はそれを自分で使用したことはありませんが、あなたが求めていることをしているようです。本当に型 (および型のみ) の等価性を使用する必要がある場合は、デフォルト値に同意するか、TypeRep
代わりに a をキーとして使用する必要があります。
まず、あまりにも明白な答えは、Typeable
(ベースライブラリの一部)を使用して「タイプ->値マップ」を簡単に作成できるということです。
import Data.Typeable
import Data.Map
type TypeMap a = Map TypeRep a
insertT :: Typeable k => k -> a -> Map k a -> Map k a
insertT v = insert (typeOf k)
lookupT :: Typeable k => k -> a -> Map k a -> Map k a
lookupT v = lookup (typeOf k)
これで、コードを使用insertT (undefined :: Int) 5
して要素をタイプ別に挿入できます。
しかし、Fusionを見ると、これは実際にはあなたが求めているもののようには見えません。任意のデータ構造で動作するコードを作成できるようですか?これは、Haskellでは「ScrapyourBoilerplate」ジェネリックプログラミングとして知られているものです。詳細については、論文またはハッキングを参照してください。ただし、任意のデータ構造を処理し、特定のタイプの値を選択するコードを記述できます。
Fusionについて私が見た他のいくつかのことは、おそらくHListやおそらくfclabelsなどのライブラリを使用してエミュレートすることができます。しかし、実際に何が必要かを見ずに、これ以上言うのは本当に難しいです。
前述dependent-map
のように、マップ側では正しい選択のように思えますが、タプルを手動でジャグリングする代わりに、 のHArray
インターフェイスを検討することをお勧めします。hlist
Data.Mapとリストをお探しですか? (例[Int]
)。