Например, у меня есть операция 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?