2012-05-02 10 views
2

Data.Dynamicを他のData.Dynamicにマップします。何Ord Dynamicはありませんので、しかし、私はハスケル - Data.Dynamicをマップに入れる簡単な方法はありますか?

Map Dynamic Dynamic 

を書き込むことはできません。 EDSLコンパイラの内側に>値 - (?toDyn機能のみOrd物事を受け入れ、そしてボクシング時に型クラスを具体化するDynamicのバージョンなど)すべてのソリューション

この動機は変数からマップを持つことではあります。 (明らかに、変数は異なるタイプを持つことができます)。 :申し訳ありませんが、この問題では必要ありません。変数名をキーとして保存するだけでよいのですか?しかし、私はまだ質問に興味があります。

ありがとうございます!

答えて

5

誰かが興味があれば、私は解決策をハッキングしました。それはちょっとトリッキー/楽しいです:)

ここにコード:http://pastebin.com/KiJqqmpj。あなたが常に同じ高次タイプの機能があれば

(私はまた、あなたにTypeable1を書くの必要性を保存し、より高次のタイプのための1つを、書いた:。http://pastebin.com/aqjwFv9pをいくつかのケースでは、Typeable1インスタンスを書くことが難しいことができます。 )

いくつかの値:

float1 = mk_ord_dyn (1 :: Float) 
float2 = mk_ord_dyn (2 :: Float) 
int1 = mk_ord_dyn (1 :: Int) 
int2 = mk_ord_dyn (2 :: Int) 

少しテスト、

*OrdDynamic> int1 == int1 
True 
*OrdDynamic> int2 == int2 
True 
*OrdDynamic> int1 < int2 
True 
*OrdDynamic> int2 < float1 
False 
*OrdDynamic> float1 < int2 
True 
*OrdDynamic> int1 == float1 
False 
+4

素敵なトリックですが、私はあなたが何をしたのかを高水準で説明しておかなければならないと思います:「ダイナミック」のように動作するタイプを作成しましたが、その値は比較関数をカプセル化します。この比較機能は、(a)同じタイプの値を比較する、(b)異種タイプの値を比較する、の2つのケースに対処しなければならない。最初のケースは、共通型の 'Ord'インスタンスを使って処理され、後者は*型*自身を比較することによって処理されます(例えば、すべての' Float'sが ''すべて '' Int'sの前にあるように)。あなたのテストが表示されます。) –

+0

@サクンディム、確かに、私はあまりにも多くのことを当然としていました。お気軽に答えを編集してください。 – gatoatigrado

+1

あなたのダイナミックバージョンでは、関数などを処理できません。これは、DSLの実装に使用されている場合には重要な機能です。 – augustss

7

いいえ、方法はありません。作成に関与するタイプによって、Dynamicは存在しません。 あなたが不純なものになりたい場合はStablePtrを使うことができますが、それは私が考えることができる最高のものです。

しかし、Ordを含むようにtoDynのタイプを変更することでそれを行うことができます。

+0

MMM、ハック...知って良い、ありがとう! – gatoatigrado

関連する問題