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

gat*_*ado 2 haskell map dynamictype

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

Map Dynamic Dynamic
Run Code Online (Sandbox Code Playgroud)

因为没有Ord Dynamic.有没有任何解决方案(比如DynamictoDyn功能只接受Ord事物的版本,并在拳击时提升类型类?)

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

提前致谢!!

aug*_*tss 7

不,没有办法.通过创造所涉及的类型Dynamic不可能.如果你想变得不纯洁,你可以使用StablePtr,但这是我能想到的最好的.

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


gat*_*ado 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)
Run Code Online (Sandbox Code Playgroud)

一点点测试,

*OrdDynamic> int1 == int1
True
*OrdDynamic> int2 == int2
True
*OrdDynamic> int1 < int2
True
*OrdDynamic> int2 < float1
False
*OrdDynamic> float1 < int2
True
*OrdDynamic> int1 == float1
False
Run Code Online (Sandbox Code Playgroud)

  • 很好的技巧,但我认为你应该在高层次上解释你做了什么:你创建了一个或多或少像`Dynamic`那样工作的类型,但它的值封装了一个比较函数.该比较函数必须处理两种情况:(a)比较相同类型的值,(b)比较异构类型的值.第一种情况是通过使用公共类型的`Ord`实例来处理的,而后者是通过比较*类型*本身来处理的(因此,例如,所有`Float`s都是"在所有`Int之前",如你的测试显示.) (4认同)