HaskellでGADTなどを使って完全型指定のDSELを作成して完全型セーフなASTを作成してきましたが、正しく型指定されたコンパイラを実行するには、Haskell型タイプと値の両方(型付きの環境)と、Haskell型システムで理解できるようなものです。 C++には、これらのような構造体(型 - >値マップ、型付き値のベクトルなど)を持つBoost.Fusionライブラリがあります。 Data.Tupleはシーケンスを処理しますが、Boost.Fusion map
のようなもののHaskell版がありますか?Boost.FusionのHaskellに相当する
答えて
dependent-mapパッケージをご覧ください。私はそれを自分で使っていませんが、あなたが求めていることをするようです。あなたが実際に型(および型のみ)の等価を使用する必要がある場合は、デフォルト値に同意するか、代わりにTypeRep
をキーとして使用する必要があります。
Data.Mapを探していますか? (例えば、[Int]
)。
いいえ、エレメントには異なるタイプが必要です。ここではキーはタイプです。私は '(Int - > 5、Float - >" foo ")のようなマッピングをグローバルマッピングを与えるタイプクラスではない値にしたいものがあります。私は手で書く方法を知っている(私は思う)が、私は誰かがすでにそれをしたかどうか疑問に思っていた。 –
依存マップパッケージを試してください:http://hackage.haskell.org/package/dependent-map –
@NathanHowell:これを回答として投稿できますか?私はそれを調べるだろうが、それは私が求めているようなドキュメントから見える。 –
まず、すべての余りに明白な答えは、あなたが簡単に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のようなライブラリを使ってエミュレートできます。しかし、実際にはあなたが実際に必要なものを見ずに多くを言うことは難しいです。
'TypeMap'は動作しますが、右側の型が左側の' TypeRep'(または 'Data.Dynamic')と一致することをコンパイラに納得させるには' unsafeCoerce'が必要です。 HListも面白そうです。 fclabelsはジッパーを提供するように見えます。私は任意のデータ型に対してリフレクション/データジェネリックプログラミングを必要としないので、SYBが役に立たないと思います。 –
さて、私は、問題の値にインデックス型を持たせたいかどうか分からなかった。必要なら 'HList'(マップのキーを静的に知っている場合)や、' unsafeCoerce'を回避するための値に 'Dynamic'を使って同様のマップ構造を使うべきでしょう。 –
前述したように、dependent-map
は、物事のマップ側のための正しい選択のように思えるが、私は手動でタプルをジャグリングするための代替としてhlist
のHArray
インターフェースを見てお勧めします。
- 1. Pythonの "Construct"に相当するHaskell
- 2. OCamlのフォーマットライブラリに相当するHaskell
- 3. HaskellのPython urllibに相当する
- 4. Boost.FusionのBoost.HanaのViewコンセプトに相当するものがありますか?
- 5. Haskellの "Scrap Your Boilerplate"のClojure相当
- 6. Haskellのscanlに相当するRubyとは何ですか?
- 7. ErlangのHaskellのas-patternsに相当する
- 8. Haskellのmain関数に相当するCommon Lisp?
- 9. OOPのクラス特化に相当するHaskell
- 10. NumPyのargsortに相当する効率的なHaskell
- 11. C#のhaskellのiterate関数に相当するものは何ですか?
- 12. Perlの$に相当する$ _
- 13. INET_NTOAとINET_ATONに相当するPHP相当額
- 14. .NETに相当するjava.awt.color.ColorSpace
- 15. Pythonに相当するPropertyUtilsBean
- 16. PowerThellに相当するSignTool.exe
- 17. カールC#に相当する
- 18. omp_get_thread_numに相当するグランドセントラルディスパッチ
- 19. イメージレンダリングDOMに相当する
- 20. '__builtin_return_address'に相当するMSVC
- 21. grepに相当するstringr
- 22. HTML5コンテキストメニューに相当する
- 23. R ++に相当するC++
- 24. PrintWriterに相当するSystem.setOut()
- 25. jQueryに相当するプロトタイプ
- 26. XDialogに相当するクロスプラットフォーム
- 27. IntelliJに相当するWindowBuilder?
- 28. "Not MyEnum.SomeValue"に相当する#
- 29. Html.Actionに相当するSDK
- 30. C++に相当する。cin.peek()
ダウンボートの理由は何ですか? –
「コンパイラ」を記述するとき、どのような表現を/からコンパイルしていますか? GADTをお持ちの場合は、実際にインタプリタを作成していますか、GADTからCコードなどの関数ですか? – sclv
どちらかといえば、入力されたASTを他のものに変換したり実行したりするのに同じ問題が発生します。 –