2011-11-29 7 views
10

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

+0

ダウンボートの理由は何ですか? –

+0

「コンパイラ」を記述するとき、どのような表現を/からコンパイルしていますか? GADTをお持ちの場合は、実際にインタプリタを作成していますか、GADTからCコードなどの関数ですか? – sclv

+0

どちらかといえば、入力されたASTを他のものに変換したり実行したりするのに同じ問題が発生します。 –

答えて

10

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

1

Data.Mapを探していますか? (例えば、[Int])。

+0

いいえ、エレメントには異なるタイプが必要です。ここではキーはタイプです。私は '(Int - > 5、Float - >" foo ")のようなマッピングをグローバルマッピングを与えるタイプクラスではない値にしたいものがあります。私は手で書く方法を知っている(私は思う)が、私は誰かがすでにそれをしたかどうか疑問に思っていた。 –

+1

依存マップパッケージを試してください:http://hackage.haskell.org/package/dependent-map –

+0

@NathanHowell:これを回答として投稿できますか?私はそれを調べるだろうが、それは私が求めているようなドキュメントから見える。 –

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ようなコードを使用することができますタイプによって要素を挿入する。

しかし、フュージョンを見ると、これは実際にあなたが後になっているようには見えません。それはあなたが任意のデータ構造で動作するコードを構築することができますか?これは、Haskellの「スクラップ・ボイラープレート」ジェネリック・プログラミングとして知られているものです。詳細については、papersまたはhackageを参照してください。ただし、任意のデータ構造を処理し、指定された型の値を取り出すコードを記述することができます。

私がFusionで見た他のいくつかの事柄は、おそらくHListやおそらくfclabelsのようなライブラリを使ってエミュレートできます。しかし、実際にはあなたが実際に必要なものを見ずに多くを言うことは難しいです。

+0

'TypeMap'は動作しますが、右側の型が左側の' TypeRep'(または 'Data.Dynamic')と一致することをコンパイラに納得させるには' unsafeCoerce'が必要です。 HListも面白そうです。 fclabelsはジッパーを提供するように見えます。私は任意のデータ型に対してリフレクション/データジェネリックプログラミングを必要としないので、SYBが役に立たないと思います。 –

+0

さて、私は、問題の値にインデックス型を持たせたいかどうか分からなかった。必要なら 'HList'(マップのキーを静的に知っている場合)や、' unsafeCoerce'を回避するための値に 'Dynamic'を使って同様のマップ構造を使うべきでしょう。 –

3

前述したように、dependent-mapは、物事のマップ側のための正しい選択のように思えるが、私は手動でタプルをジャグリングするための代替としてhlistHArrayインターフェースを見てお勧めします。