Является ли оператор && строгим в Haskell?

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

15
задан ljedrz 31 August 2016 в 13:31
поделиться