我正在通过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,这是如何工作的呢?这是因为保护条款吗?
答案 0 :(得分:0)
要回答您的上一个问题,是的,您的代码因保护条款而有效。这是因为列表在Haskell中的工作方式。
在内部,Haskell列表是链表。简而言之,这意味着列表项可以是空列表,也可以是一对事物和另一个列表。
为了具体化,这是一个例子。
列表[5,10,15]
是一对5
和列表[10,15]
。
列表[10,15]
是一对10
和列表[15]
。
列表[15]
是一对15
和空列表[]
。
此列表也可以写为5:10:15:[]
,这就是模式(x:xs)
的来源。
这应该清楚你的功能是如何工作的。包含某些项目的列表将与(x:xs)
模式匹配。如果列表项都不是False
,则该函数将继续在列表的其余部分上执行,直到列表的其余部分只是空列表,此时它与[]
模式匹配并且您得到你的答案。