我想将Data.Dynamic
映射到其他Data.Dynamic
。但是,我不能写
Map Dynamic Dynamic
因为没有Ord Dynamic
。是否有任何解决方案(例如Dynamic
版本的toDyn
函数仅接受Ord
个事物,并在装箱时提升类型类别?)
这样做的动机是从变量中获取一张地图 - > EDSL编译器中的值。 (显然,变量可以有不同的类型。) 编辑:对不起,这个问题没有必要,我可以/应该只将变量名存储为密钥。但是,我仍然对这个问题感兴趣。
提前致谢!!
答案 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