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 - Fatal编程技术网

Haskell 这两个部分应用程序是否不同?哈斯克尔

Haskell 这两个部分应用程序是否不同?哈斯克尔,haskell,Haskell,我想在Haskell中以不同的方式实现“xor”(异或)函数,只使用部分应用程序。我不允许使用模式匹配或lambda表达式。所以我的问题是,这两个xor函数的实现有什么不同吗 xor1 :: Bool -> Bool -> Bool xor1 x = (/=) x xor2 :: Bool -> Bool -> Bool xor2 x = (/= x) 所以我的问题是,这两个xor函数的实现有什么不同吗 对!!实现方式不同;然而,由于平等的性质,结果将是相同的 让我们

我想在Haskell中以不同的方式实现“xor”(异或)函数,只使用部分应用程序。我不允许使用模式匹配或lambda表达式。所以我的问题是,这两个xor函数的实现有什么不同吗

xor1 :: Bool -> Bool -> Bool
xor1 x = (/=) x

xor2 :: Bool -> Bool -> Bool
xor2 x = (/= x)
所以我的问题是,这两个xor函数的实现有什么不同吗

对!!实现方式不同;然而,由于平等的性质,结果将是相同的


让我们看看这两个函数,并展开无点部分:

xor1 :: Bool -> Bool -> Bool
xor1 x y = (/=) x y

xor2 :: Bool -> Bool -> Bool
xor2 x y = (/= x) y
因此,如果我们将它们移动到中缀样式进行比较,我们可以更容易地看到实现中的差异:

xor1 :: Bool -> Bool -> Bool
xor1 x y = x /= y 

xor2 :: Bool -> Bool -> Bool
xor2 x y = y /= x
然而,由于等式是可交换的,所以这些表达式是等价的

由于
/=
被定义为运算符,因此它的行为不同于常规函数,因为默认情况下它应用于中缀。使用全括号运算符
(/=)
可以更改此行为。这与其他必须使用反勾号表示为中缀的函数相反。如果我们改为使用一个非运算符的
notEqual
函数,那么实现将是相同的

notEqual = (/=)

xor1 :: Bool -> Bool -> Bool
xor1 x y = notEqual x y

xor2 :: Bool -> Bool -> Bool
xor2 x y = (notEqual x) y = notEqual x y

正如@duplode在评论中提到的,看待这个问题的另一种方式是完全零分而不是满分:

xor1 :: Bool -> Bool -> Bool
xor1 = (/=) 

xor2 :: Bool -> Bool -> Bool
xor2 = flip (/=) 
所以我的问题是,这两个xor函数的实现有什么不同吗

对!!实现方式不同;然而,由于平等的性质,结果将是相同的


让我们看看这两个函数,并展开无点部分:

xor1 :: Bool -> Bool -> Bool
xor1 x y = (/=) x y

xor2 :: Bool -> Bool -> Bool
xor2 x y = (/= x) y
因此,如果我们将它们移动到中缀样式进行比较,我们可以更容易地看到实现中的差异:

xor1 :: Bool -> Bool -> Bool
xor1 x y = x /= y 

xor2 :: Bool -> Bool -> Bool
xor2 x y = y /= x
然而,由于等式是可交换的,所以这些表达式是等价的

由于
/=
被定义为运算符,因此它的行为不同于常规函数,因为默认情况下它应用于中缀。使用全括号运算符
(/=)
可以更改此行为。这与其他必须使用反勾号表示为中缀的函数相反。如果我们改为使用一个非运算符的
notEqual
函数,那么实现将是相同的

notEqual = (/=)

xor1 :: Bool -> Bool -> Bool
xor1 x y = notEqual x y

xor2 :: Bool -> Bool -> Bool
xor2 x y = (notEqual x) y = notEqual x y

正如@duplode在评论中提到的,看待这个问题的另一种方式是完全零分而不是满分:

xor1 :: Bool -> Bool -> Bool
xor1 = (/=) 

xor2 :: Bool -> Bool -> Bool
xor2 = flip (/=) 

哦,是的,我犯了一个与此密切相关的错误:(我不反对这个问题,因为在这个问题中,主要问题以更清晰的方式表达)。哦,是的,我犯了一个与此密切相关的错误:(我不反对这个错误,因为在这个问题中,主要问题以更清晰的方式表达)。“让我们看看这两个函数,并展开无点部分[…]”——或者,如果我们要使它们完全无点,
xor1=(/=)
xor2=flip(/=)
@duplode完全正确,但我认为初学者通常会被无点符号所迷惑,因此我选择了相反的方向。您介意我将其编辑到我的答案中,作为解决此问题的额外示例吗?请随意编辑。(顺便说一句,我同意在这个答案中优先考虑有意义的方式。对我来说,也显示另一种方式的主要动机是,
xor1=(/=)
清楚地表明操作符只是函数,上面有一点额外的语法糖分——尽管你的
notEqual
示例可以说已经扮演了这个角色。)”让我们看看这两个函数,并展开无点部分[…]“——或者,如果我们要使它们完全无点,
xor1=(/=)
xor2=flip(/=)
@duplode完全正确,但我认为初学者通常会被无点符号所迷惑,因此我选择了相反的方向。您介意我将其编辑到我的答案中,作为解决此问题的额外示例吗?请随意编辑。(顺便说一句,我同意在这个答案中优先考虑有意义的方式。对我来说,显示另一种方式的主要动机是,
xor1=(/=)
清楚地表明操作符只是函数,上面有一点额外的语法糖分——尽管你的
notEqual
示例可以说已经扮演了这个角色。)