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