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,则永远不需要评估第二个参数.
就像马丁所说的那样,懒惰评估的语言永远不会评估任何不需要立即获得价值的东西.在像Haskell这样的懒惰语言中,您可以免费获得短路.在大多数语言中,|| 和&&和类似的操作符必须专门用于语言,以便进行短路评估.但是,在Haskell中,懒惰的评估使得这不必要.你可以定义一个自己短路的功能:
scircuit fb sb = if fb then fb else sb
此函数的行为与逻辑"或"运算符类似.这是如何|| 在Haskell中定义:
True || _ = True
False || x = x
Run Code Online (Sandbox Code Playgroud)
那么,为了给你问题的具体答案,没有.如果是||的左侧 是的,右手边从未被评估过.您可以将两个和两个放在一起用于"短路"的其他操作员.
| 归档时间: |
|
| 查看次数: |
3194 次 |
| 最近记录: |