这已被窃听我最近一个简单的问题。哈斯克尔是否在一个函数返回一个布尔执行所有的等效性检验,即使其中一个返回一个错误的价值?

例如

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

所以,给你的具体回答你的问题,没有。如果||的左手边是真实的,右手边是永远不会计算。你可以把两者结合为其他操作符“短路”。

懒惰评估装置,没有东西直到真正需要它进行评价。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top