检查列表中的所有项是否都为真

时间:2015-11-15 08:15:00

标签: haskell logical-operators

我正在通过Programming in Haskell工作,并被问到以下内容:

  

确定列表中的所有逻辑值是否均为真。

我在纸上勾勒出一些东西,然后结束:

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

一直在思考,好吧,我知道我正确地遍历了列表,但是我如何跟踪真实的价值观(是的,我可能认为太过于像功能上的命令性思维一样世界)。

无论如何,我运行代码并且它是正确的。但是,当我发现真正的价值时,我从未告诉它如何表现。

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

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

当然这也有效。

现在我的问题是,它为什么有效?由于我在列表和函数的情况下从未告诉它使用True,这是如何工作的呢?这是因为保护条款吗?

1 个答案:

答案 0 :(得分:0)

要回答您的上一个问题,是的,您的代码因保护条款而有效。这是因为列表在Haskell中的工作方式。

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

为了具体化,这是一个例子。

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

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

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

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

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