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