Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查两个Haskell函数在非终止或错误方面是否相等_Haskell_Lambda_Functional Programming - Fatal编程技术网

检查两个Haskell函数在非终止或错误方面是否相等

检查两个Haskell函数在非终止或错误方面是否相等,haskell,lambda,functional-programming,Haskell,Lambda,Functional Programming,我想知道,两个Haskell函数是相等的,同时考虑到执行会导致错误或根本不终止的情况 示例(这些函数都将函数和对作为参数,将函数应用于对的两个成员,如果结果相同,则返回True,否则返回False): 我的问题是:我如何发现,在非终止或错误的情况下,它们的功能将如何运行 我知道第一个函数可以翻译成 tupleEqual f = let fun (x,y) = f x == f y in fun 这是否相关?如果您想了解这两个函数在部分输入上的行为,您可以自己提供部分输入。对于一对(比如说类型(

我想知道,两个Haskell函数是相等的,同时考虑到执行会导致错误或根本不终止的情况

示例(这些函数都将函数和对作为参数,将函数应用于对的两个成员,如果结果相同,则返回True,否则返回False):

我的问题是:我如何发现,在非终止或错误的情况下,它们的功能将如何运行

我知道第一个函数可以翻译成

tupleEqual f = let fun (x,y) = f x == f y in fun

这是否相关?

如果您想了解这两个函数在部分输入上的行为,您可以自己提供部分输入。对于一对(比如说类型
(Int,Int)
),关于偏好有四种不同的可能性

(1,1)——总计
(| |,1)--左下角
(1,124; 124;)——右下角
_|_--底部
您可以使用
undefined
作为底部值,并像通常在ghci中一样测试函数。我们将在这里测试
fst
函数作为示例:

fst(1,1) 1. >>>fst(未定义,1) 未定义 >>>fst(1,未定义) 1. >>>fst未定义 未定义 所有这些都很明显,所以这里有一个稍微有趣的例子

mapFst::(a->b)->(a,c)->(b,c)
mapFst f(x,y)=(fx,y)
mapFst':(a->b)->(a,c)->(b,c)
mapFst'f xy=(f(fst xy),snd xy)
>>>fst(mapFst(常数1)未定义)
未定义
>>>fst(映射fst’(常数1)未定义)
1.
您还可以用一种无可辩驳的模式(
~(x,y)
)编写
mapFst'


最后,如果您想将其作为自动化测试框架的一部分进行测试,或者只是想更系统地进行测试,您可以使用该软件包。

如果您想了解这两个函数在部分输入上的行为,您可以自己提供部分输入。对于一对(比如说类型
(Int,Int)
),关于偏好有四种不同的可能性

(1,1)——总计
(| |,1)--左下角
(1,124; 124;)——右下角
_|_--底部
您可以使用
undefined
作为底部值,并像通常在ghci中一样测试函数。我们将在这里测试
fst
函数作为示例:

fst(1,1) 1. >>>fst(未定义,1) 未定义 >>>fst(1,未定义) 1. >>>fst未定义 未定义 所有这些都很明显,所以这里有一个稍微有趣的例子

mapFst::(a->b)->(a,c)->(b,c)
mapFst f(x,y)=(fx,y)
mapFst':(a->b)->(a,c)->(b,c)
mapFst'f xy=(f(fst xy),snd xy)
>>>fst(mapFst(常数1)未定义)
未定义
>>>fst(映射fst’(常数1)未定义)
1.
您还可以用一种无可辩驳的模式(
~(x,y)
)编写
mapFst'


最后,如果您想将其作为自动化测试框架的一部分进行测试,或者您只是想更系统地进行测试,那么您可以使用该软件包。

您是否要求决定函数是否终止?这是一个停顿的问题,众所周知是不可判定的——没有算法可以实现这一点。我明白了。我只是想知道如何检查两个函数是否相等。如中所述,如果我使用lambda抽象(例如编译器如何处理未终止的输入的函数),这会有区别吗?两个任意函数的等价性是可以的,因此您是否要求确定函数是否终止也是不确定的?这是一个停顿的问题,众所周知是不可判定的——没有算法可以实现这一点。我明白了。我只是想知道如何检查两个函数是否相等。如中所述,如果我使用lambda抽象,它会有区别吗?例如,关于编译器如何处理未终止输入的函数?两个任意函数的等价性可能是,因此它也是不可判定的。非常感谢。如果我说对了,在上面的例子中,没有一个函数会在两个输入都未定义的情况下运行,所以我可以说它们是相等的?(考虑到给定相同的有效输入时,它们总是返回相同的结果)事实并非如此。这两个函数相等,但不是因为你所说的原因。如果
f
没有检查其输入,那么对于
(未定义,未定义)
的输入,两个函数都将返回
True
。非常感谢。如果我说对了,在上面的例子中,没有一个函数会在两个输入都未定义的情况下运行,所以我可以说它们是相等的?(考虑到给定相同的有效输入时,它们总是返回相同的结果)事实并非如此。这两个函数相等,但不是因为你所说的原因。如果
f
未检查其输入,则对于
(未定义,未定义)
的输入,两个函数都将返回
True
tupleEqual f = let fun (x,y) = f x == f y in fun