If statement 在单个if语句中使用AND组合计算多个条件 在C++等语言中,如果在“IF”语句中存在多个条件,并且条件与使用和(即,&)结合,则只要条件之一是错误的,则不发生后续条件的评价。哈斯克尔也是这样吗? 例如,在下面的Haskell代码中,如果conditionA的值为FALSE,那么conditionB的计算会发生吗 fun :: Haxl (Maybe Bool) fun = if conditionA .&& conditionB then return $ Just True else return Nothing
哈斯克尔的情况也是如此<代码>&的定义如下:If statement 在单个if语句中使用AND组合计算多个条件 在C++等语言中,如果在“IF”语句中存在多个条件,并且条件与使用和(即,&)结合,则只要条件之一是错误的,则不发生后续条件的评价。哈斯克尔也是这样吗? 例如,在下面的Haskell代码中,如果conditionA的值为FALSE,那么conditionB的计算会发生吗 fun :: Haxl (Maybe Bool) fun = if conditionA .&& conditionB then return $ Just True else return Nothing,if-statement,haskell,If Statement,Haskell,哈斯克尔的情况也是如此&的定义如下: False && _ = False True && y = y 这相当于以下内容: (&&) x y = case x of False -> False True -> y Haskell中的惰性计算是根据案例定义的:当您对某个对象的模式匹配进行计算时,将尽可能强制(计算)以确定要匹配的构造函数。所以这是自动短路 在哈斯凯尔,这一点普遍适用。例如,foldr(&&&)True[Tr
False && _ = False
True && y = y
这相当于以下内容:
(&&) x y = case x of
False -> False
True -> y
Haskell中的惰性计算是根据案例定义的:当您对某个对象的模式匹配进行计算时,将尽可能强制(计算)以确定要匹配的构造函数。所以这是自动短路
在哈斯凯尔,这一点普遍适用。例如,foldr(&&&)True[True,True,False,error“not reach”]
计算True&&True&&True&&False&&error“not reach”
,它在计算False
后立即返回False
,从不计算error
调用
此外,由于懒惰,在Haskell中,您始终可以将表达式指定给变量,并且它不会更改所计算的内容。例如,它们完全等效:
example1 x = cheapTest x || expensiveTest x
除非对cool
进行评估,否则不会调用expensiveTest
,只有当ok
为False
时,才会调用cool
。这与热切评估的语言不同,后者可能会改变运行时成本,而与非引用透明语言不同,后者可能会改变副作用。例如,在JavaScript中,example1
和example2
不同:
function cheapTest(x) {
console.log('cheap test');
return x !== 0;
}
function expensiveTest(x) {
console.log('expensive test');
return Math.log2(x) < 10;
}
// Short-circuits second effect if possible.
function example1(x) {
return cheapTest(x) || expensiveTest(x);
}
// Always evaluates both effects.
function example2(x) {
var okay = cheapTest(x);
var cool = expensiveTest(x);
return okay || cool;
}
因此,这是为库定义的自定义GenHaxl
操作类型指定相同类型的短路。首先,此函数执行动作fa
,该动作生成分配给a
的Bool
,然后只有当a
为True
时,它才会执行下一个动作fb
。如果a
为False
,它只运行操作返回False
(=纯False
),该操作不会产生任何副作用并产生False
Haxl还使用rebindabletsyntax
扩展来覆盖if
..then
....else
..语法,以允许在if
条件下产生副作用。在没有该扩展名的普通Haskell代码中,您需要将效果与if
分开,例如,在do
块中使用单独的绑定语句:
fun = do
c <- conditionA .&& conditionB
if c
then return $ Just True
else return Nothing
-- or: return $ if c then Just True else Nothing
fun=do
C
fa .&& fb = do a <- fa; if a then fb else return False
fun = do
c <- conditionA .&& conditionB
if c
then return $ Just True
else return Nothing
-- or: return $ if c then Just True else Nothing