【问题标题】:Check if all items in a list are true检查列表中的所有项目是否为真
【发布时间】:2016-02-16 12:12:19
【问题描述】:

我正在处理Programming in Haskell 并被问到以下问题:

判断一个列表中的所有逻辑值是否为真。

我在纸上画了一些东西,最后得到了:

listand     ::  [Bool] -> Bool
listand []              = True
listand (x:xs)  
    | x == False        = False
    | otherwise         = listand xs

一直在想,好吧,我知道我正在正确地遍历列表,但是我如何跟踪 True 值(是的,我的思维方式可能太像功能世界中的命令式思维)。

无论如何,我运行了代码并且它是正确的。但是我从来没有告诉它当它找到一个真正的价值时如何表现。

所以我为 OR 做了同样的事情:

listor      ::  [Bool] -> Bool
listor []               = False
listor (x:xs)
    | x == True         = True
    | otherwise         = listor xs

果然这也有效。

现在我的问题是,为什么它会起作用?由于我从来没有告诉它在 listand 函数的情况下使用 True ,所以这究竟是如何工作的?是因为守卫条款吗?

【问题讨论】:

  • 好吧,otherwiseFalseTrue,对吧?
  • 哦等等...空列表的定义在哪里?
  • 这就是为什么您的草图将无法工作(并且永远不会产生True) - 尝试使用[][True],...您是如何运行此代码以产生True?
  • 输入什么? (第一个版本甚至没有正确的语法,因为缺少 = - 所以你可能没有给我们你测试过的版本)
  • 好吧,我没有拥抱可以尝试这个,但这真的很令人惊讶 - 你确定你给了我们正确的版本吗?因为 i GHC(i) 它将产生“非详尽模式”异常 - 这是可以预料的......好吧

标签: haskell logical-operators


【解决方案1】:

要回答您的最后一个问题,是的,您的代码之所以有效,是因为有保护子句。这是因为列表在 Haskell 中的工作方式。

在内部,Haskell 列表是链表。简而言之,这意味着一个列表项要么是空列表,要么是一个事物和另一个列表的对。

为了具体说明,这里有一个例子。

列表[5,10,15] 是一对5 和列表[10,15]

列表[10,15] 是一对10 和列表[15]

列表[15] 是一对15 和空列表[]

这个列表也可以写成5:10:15:[],这就是模式(x:xs)的由来。

这应该清楚您的功能是如何工作的。包含一些项目的列表将匹配 (x:xs) 模式。如果列表项都不是False,则该函数将继续在列表的其余部分上执行,直到列表的其余部分只是空列表,此时它与[] 模式匹配,您将得到最终答案.

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多