有没有办法让我可以在一组函数上任意建立一个部分顺序。
即,给定两个函数f,g;我可以持续评估f< g到一些真值。
答案 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 x
和g x
的所有x
进行比较a
直到f x /= g x
。这与比较元组相同,因为来自有限a
的函数与n元元组是同构的。