题
这已被窃听我最近一个简单的问题。哈斯克尔是否在一个函数返回一个布尔执行所有的等效性检验,即使其中一个返回一个错误的价值?
例如
f a b = ((a+b) == 2) && ((a*b) == 2)
如果第一测试返回false,将它的&&
之后执行第二测试?或者是哈斯克尔懒惰够不这样做,继续前进?
解决方案
应短路就像其他语言。它被定义像这样在前奏:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
因此,如果所述第一参数是False永不需要进行评估的第二
其他提示
就像马丁说,懒惰的评价语言从来不评价任何的价值并不立即需要。在一个慵懒的语言如Haskell中,你会得到短路免费。在大多数语言中,||而&&和类似的运营商必须专门建成,以便他们能够短路评价的语言。然而,在Haskell,懒惰的评价,使这是不必要的。你可以定义一个函数,短路甚至自己:
scircuit fb sb = if fb then fb else sb
此功能将表现就像逻辑“或”运算符。下面是如何||在Haskell定义:
True || _ = True
False || x = x
所以,给你的具体回答你的问题,没有。如果||的左手边是真实的,右手边是永远不会计算。你可以把两者结合为其他操作符“短路”。
懒惰评估装置,没有东西直到真正需要它进行评价。
不隶属于 StackOverflow