【发布时间】:2019-11-24 12:40:22
【问题描述】:
我想知道,我两个 Haskell 函数是相等的,还要考虑执行导致错误或根本不终止的情况。
示例(这些函数都接受一个函数和一对作为参数,将函数应用于该对的两个成员,如果结果相同则返回 True,否则返回 False):
tupleEqual, tupleEqual' :: Eq b => (a -> b) -> (a, a) -> Bool
tupleEqual f = (\(x,y) -> f x == f y)
tupleEqual' f (x, y) = f x == f y
我的问题是:我如何找出它们在未终止或错误的情况下的行为方式?
我知道第一个函数可以翻译成
tupleEqual f = let fun (x,y) = f x == f y in fun
这可能是相关的吗?
【问题讨论】:
-
您是否要求确定函数是否终止?这是停止问题,众所周知,它是不可判定的——没有算法可以实现这一点。 en.wikipedia.org/wiki/Halting_problem
-
我明白了。我只是想知道如何检查两个函数是否相等。例如,如果我使用 lambda 抽象,它会有所不同吗?例如,关于编译器如何处理不终止输入的函数?
-
两个任意函数的等价可以是reduced to halting problem,所以也是不可判定的
标签: haskell lambda functional-programming