Haskell中的短路(&&)

Jon*_*FTW 18 haskell boolean combinators

一个一直困扰我的快速问题.Haskell是否在返回布尔值的函数中执行所有等价测试,即使返回false值也是如此?

例如

f a b = ((a+b) == 2) && ((a*b) == 2)
Run Code Online (Sandbox Code Playgroud)

如果第一个测试返回false,它会在第二个测试之后执行&&吗?或者哈斯克尔是否懒得不去做并继续前进?

Cal*_*leb 20

应该像其他语言一样短路.它在Prelude中的定义如下:

(&&)                    :: Bool -> Bool -> Bool
True  && x              =  x
False && _              =  False
Run Code Online (Sandbox Code Playgroud)

因此,如果第一个参数为False,则永远不需要评估第二个参数.


Ray*_*yne 5

就像马丁所说的那样,懒惰评估的语言永远不会评估任何不需要立即获得价值的东西.在像Haskell这样的懒惰语言中,您可以免费获得短路.在大多数语言中,|| 和&&和类似的操作符必须专门用于语言,以便进行短路评估.但是,在Haskell中,懒惰的评估使得这不必要.你可以定义一个自己短路的功能:

scircuit fb sb = if fb then fb else sb

此函数的行为与逻辑"或"运算符类似.这是如何|| 在Haskell中定义:

True  || _ = True
False || x = x
Run Code Online (Sandbox Code Playgroud)

那么,为了给你问题的具体答案,没有.如果是||的左侧 是的,右手边从未被评估过.您可以将两个和两个放在一起用于"短路"的其他操作员.