Например, у меня есть операция fnB :: a -> Bool
, которая не имеет смысла, пока fnA :: Bool
не вернет False
. В C я могу составить эти две операции в одном блоке if
:
if( fnA && fnB(a) ){ doSomething; }
и C гарантируют, что fnB
не будет выполняться до тех пор, пока fnA
не вернет false.
Но Haskell ленив, и, как правило, нет гарантии, что операция будет выполняться первой, пока мы не будем использовать seq
, $!
или что-то еще, чтобы сделать наш код строгим. Как правило, это то, что нам нужно быть счастливым. Но используя оператор &&
, я ожидал бы, что fnB
не будет оцениваться до тех пор, пока fnA
не вернет результат. Предоставляет ли Haskell такую гарантию &&
? И будет ли Haskell оценивать fnB
, даже когда fnA
возвращает False?