gpt4 book ai didi

Haskell 在包含底部类型的 Foldables 上折叠交换、关联函数

转载 作者:行者123 更新时间:2023-12-02 04:06:33 26 4
gpt4 key购买 nike

我最近尝试运行代码:

> let _l_ = _l_
> any [True, _l_, False]
True
> any [False, _l_, True]

> -- _l_

我想知道这是否被认为是正确的行为,因为 any 被定义为 foldr (||) False 并且 || 是关联的并且可交换。

不应该_l_ ||真==真|| _l_ 为 true,且 (False || _l_) ||真==假|| (_l_ || True) 是真的吗?

我如何实现一个 any 来生成关联、可交换的函数应用程序?

我刚开始尝试理解底部; || 是否应该返回?

谢谢

最佳答案

这种行为是正确的。

不应该_l_ ||真==真|| _l_是真的

在有底部的情况下,情况并非如此。 || 必须首先评估一侧,然后如果该值为 False,则必须评估另一侧。 GHC.Classes 的定义是

(||)                    :: Bool -> Bool -> Bool
True || _ = True
False || x = x

所以你可以看到它首先检查左边的参数。如果左边的参数是底部,那么计算就会发散,整个事情就是底部。但是,如果左侧参数为 True,则永远不会检查右侧参数,因此即使它位于底部,结果仍然为 True

(False || _l_) ||真==假|| (_l_ || True) 是真的吗?

这是真的,两个值都是底部。 || 即使存在底部也是结合的,但不是可交换的。

您可以采用几种方法来构建可交换的 any,但它们往往涉及并发。一种方法是使用类似 por 的函数,它会比较两个值,如果其中一个为 True,则返回 True;如果两者都返回 False,则返回 False,否则发散。或者您可以自己构建它。

关于Haskell 在包含底部类型的 Foldables 上折叠交换、关联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20418961/

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