gpt4 book ai didi

haskell - Haskell 中的运算符 && 是否严格?

转载 作者:行者123 更新时间:2023-12-03 15:15:25 24 4
gpt4 key购买 nike

比如我有一个操作fnB :: a -> Bool直到 fnA :: Bool 才有意义返回 False .在 C 语言中,我可以将这两个操作组合成一个 if堵塞:

if( fnA && fnB(a) ){ doSomething; }

和 C 将保证 fnB直到 fnA 才会执行返回假。

但是 Haskell 是懒惰的,一般情况下,不能保证什么操作会先执行,直到我们不使用 seq , $! ,或其他使我们的代码严格的东西。一般来说,这就是我们需要快乐的东西。但是使用 &&运算符(operator),我希望 fnB直到 fnA 才会被评估返回其结果。 Haskell 是否通过 && 提供这样的保证? ? Haskell 是否会评估 fnB即使 fnA返回假?

最佳答案

函数(&&)只有当它的第一个参数是 True 时,它的第二个参数才是严格的。 .它的第一个论点总是严格的。这种严格/懒惰是保证评估顺序的原因。

所以它的行为与 C 完全一样。不同之处在于在 Haskell 中,(&&)是一个普通的函数。在 C 中,这是不可能的。

But Haskell is lazy, and, generally, there are no guarantee what operation will execute first, until we don't use seq, $!, or something else to make our code strict.



这是不正确的。真相更深。

严格的速成类(class):

我们知道 (&&)第一个参数是严格的,因为:
⊥ && x = ⊥

这里,⊥ 类似于 undefined或无限循环(⊥ 发音为“底部”)。我们也知道 (False &&)在它的第二个参数中是非严格的:
False && ⊥ = False

它不可能评估它的第二个参数,因为它的第二个参数是⊥,它不能被评估。但是,函数 (True &&)在第二个论点中是严格的,因为:
True && ⊥ = ⊥

所以,我们说 (&&)第一个参数总是严格的,只有当第一个参数是 True 时,第二个参数才严格.

评价顺序:

对于 (&&) ,其严格性足以保证执行顺序。情况并非总是如此。例如, (+) :: Int -> Int -> Int在两个参数中总是严格的,因此可以首先评估任何一个参数。但是,您只能通过捕获 IO 中的异常来区分。 monad,或者如果你使用 unsafe功能。

关于haskell - Haskell 中的运算符 && 是否严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com