Haskell - 将Data.Dynamic放入Map中的任何简单方法?

时间:2012-05-02 21:53:19

标签: haskell map dynamictype

我想将Data.Dynamic映射到其他Data.Dynamic。但是,我不能写

Map Dynamic Dynamic

因为没有Ord Dynamic。是否有任何解决方案(例如Dynamic版本的toDyn函数仅接受Ord个事物,并在装箱时提升类型类别?)

这样做的动机是从变量中获取一张地图 - > EDSL编译器中的值。 (显然,变量可以有不同的类型。) 编辑:对不起,这个问题没有必要,我可以/应该只将变量名存储为密钥。但是,我仍然对这个问题感兴趣。

提前致谢!!

2 个答案:

答案 0 :(得分:7)

不,没有办法。根据创建Dynamic所涉及的类型,不可能存在。 如果你想变得不纯洁,你可以使用StablePtr,但这是我能想到的最好的。

但是通过将toDyn的类型更改为包含Ord,可以完成。

答案 1 :(得分:5)

如果有人有兴趣,我会破解解决方案;这有点棘手/有趣:)

此处代码:http://pastebin.com/KiJqqmpj

(我还为高阶类型写了一个,如果你总是拥有相同的高阶类型函数,那么你可以节省编写Typeable1的需要: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