10

私は、完全にタイプセーフな AST のために GADT などを使用して、Haskell で完全に型指定された DSEL を作成して遊んでいます。正しく型指定されたコンパイラを実行するには、Haskell 型から型と値の両方 (型付き環境) へのマップなどの構造が必要なようです。など、Haskell の型システムで理解できます。C++ には、これらのような構造 (型->値マップ、型付き値のベクトルなど) を備えた Boost.Fusion ライブラリがあります。Data.Tuple はシーケンスを処理しますが、Boost.Fusion などmapの Haskell バージョンはありますか?

4

4 に答える 4

10

dependent-mapパッケージを見てください。私はそれを自分で使用したことはありませんが、あなたが求めていることをしているようです。本当に型 (および型のみ) の等価性を使用する必要がある場合は、デフォルト値に同意するか、TypeRep代わりに a をキーとして使用する必要があります。

于 2011-11-29T17:51:47.283 に答える
4

まず、あまりにも明白な答えは、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などのライブラリを使用してエミュレートすることができます。しかし、実際に何が必要かを見ずに、これ以上言うのは本当に難しいです。

于 2011-11-29T17:57:28.917 に答える
3

前述dependent-mapのように、マップ側では正しい選択のように思えますが、タプルを手動でジャグリングする代わりに、 のHArrayインターフェイスを検討することをお勧めします。hlist

于 2011-11-29T19:58:54.963 に答える
1

Data.Mapとリストをお探しですか? (例[Int])。

于 2011-11-29T17:11:08.900 に答える