比较功能'编码在哈斯克尔

时间:2016-05-20 05:30:03

标签: haskell

有没有办法让我可以在一组函数上任意建立一个部分顺序。

即,给定两个函数f,g;我可以持续评估f< g到一些真值。

2 个答案:

答案 0 :(得分:6)

没有。无法将功能相互比较。您甚至无法评估f == g

如果你能做到这一点(并且你可能通过例如进入IO来查找函数的内存地址),那么你将违反参照透明度。请考虑以下定义:

f = (+) 2
g x = 2 + x

对于所有输入,这两个函数的行为相同,这意味着通过引用透明度,您可以互换地处理它们:foo f对于任何foo g应该等于foo,因此foo f g应与foo g f相同。但是,如果我们让foo成为您的(<)函数,我们就会违反此法律。很多Haskell依赖于参考透明度,所以即使你能找到一些方法来欺骗这个我也鼓励你不要。

但是如果你想使用IO,我认为用签名编写函数是相对无害的:

(<) :: a -> b -> IO Bool

通过查看两个参数的内存地址。

答案 1 :(得分:3)

你有点can。如果在a -> b a中有限且b可以订购,那么您只需要对f xg x的所有x进行比较a直到f x /= g x。这与比较元组相同,因为来自有限a的函数与n元元组是同构的。