【问题标题】:Understanding Data.List's or & and w/ Empty Lists了解 Data.List 的或 & 和 w/ 空列表
【发布时间】:2014-06-17 13:20:37
【问题描述】:

Hoogle 解释 Data.List 的 orand

and 返回布尔列表的连接。结果是 确实,列表必须是有限的;但是,False 是 False 的结果 有限或无限列表的有限索引处的值。

or 返回布尔列表的析取。结果是 False,列表必须是有限的;然而,True 来自 True 有限或无限列表的有限索引处的值。

根据阅读这些定义,为什么 or []and [] 分别计算为 FalseTrue

*Main> :m Data.List

Prelude Data.List> or []
False

Prelude Data.List> and []
True

【问题讨论】:

    标签: haskell


    【解决方案1】:

    and xs 对应于语句“xs 的所有元素都为真”。数理逻辑定律说这应该等同于“在 xs 中存在一个错误的元素是错误的”这一陈述(请参阅here 了解我所暗示的一些形式逻辑)。

    空列表中存在一个错误的元素显然是错误的。所以这表明and [] 应该可能返回 True。返回False 将是不一致的,尽管我们可以想象它是一个错误,只是说and 在空列表上是未定义的。但是,如果有人有一个用例,他们希望and [] 获取True,那么他们可以显式检查空列表并做他们想做的任何事情;如果and [] 抛出运行时错误,这正是他们必须做的。因此,即使对于True 是不恰当答案的用例,我们也不会通过使其出错而真正获得任何收益,因此我们不妨保持与逻辑的类比并返回True。而且这种方式更容易实现,因为您不必将空列表视为特殊情况;明显的折叠只是做了正确的事情:and = foldr (&&) True

    对于or,同样的推理也适用,只是“反过来”。 or xs 对应于语句“存在一个为真的 xs 元素”。这样看来,or [] 显然不包含任何为真的元素,所以结果应该是False。同样,这两者都保持了与形式逻辑的类比,并且是最容易实现的东西,所以没有理由不这样做。

    【讨论】:

      【解决方案2】:

      在操作上,orand 分别与 (||)(&&) 折叠。如果我们有or [] = True,那么or 总是会产生True;类似地,and [] = False 意味着and 总是会导致False

      在语义上它也有意义。我将您推荐给math.stackexchange 以获得很好的解释。

      【讨论】:

      • 这对我来说很有意义。但是,从概念上讲,or/and [] 如何返回 True 或 False?没什么好评价的
      • @KevinMeredith:他们正在空列表中进行评估,[]
      • @KevinMeredith ...空列表,这是foldr 的基本情况。
      【解决方案3】:

      查看source,是因为它们被定义为

      and = foldr (&&) True
      or  = foldr (||) False
      

      所以在空列表上,foldr 返回初始值,TrueFalse 分别为 andor

      【讨论】:

        【解决方案4】:

        对于or[] 是有限的,并且在任何索引处都没有True 值,因此它必须是False[] 在任何索引中都没有 False 值,因此 and [] 必须是 True

        这对于递归的基本情况也很有效,因为Falseor 的标识,Trueand 的标识。对于所有 xs:

        or  (False:xs) = or  xs
        and (True :xs) = and xs
        

        顺便说一句,这些是递归定义的一部分

        【讨论】:

          【解决方案5】:

          这样想:

          如果列表中的任何项目为Trueor 返回True(否则为False)。

          or []: 你能看到多少个True 元素?没有。那就是False

          and 返回False,如果有任何项目是False

          and []:再一次,你能看到多少个False 元素?没有。那就是True

          【讨论】:

            猜你喜欢
            • 2016-02-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-16
            • 1970-01-01
            • 2011-07-18
            • 2021-01-25
            • 1970-01-01
            相关资源
            最近更新 更多