我正在尝试在Haskell中实现所有函数,它工作正常,但我认为我的基本情况不好,如果我将基本情况的结果设置为False它更有意义,我的意思不是一个成员空列表以真实单词传递测试条件,因此答案应为false,但另一方面,如果我将其定义为false,则整个函数无法正常工作。
all' test [] = True
all' test (x:xs)
| not (test x) = False
| otherwise = all' test xs
答案 0 :(得分:7)
考虑这一点:对于一个空列表,谓词适用于列表中的所有元素。
为什么呢?因为没有违反它的元素。
因此,空列表的基本情况为True
。
答案 1 :(得分:7)
all
旨在与形式逻辑中的语句具有相同的含义,∀xεL: test(x)其中L是第一个参数的列表。如果你不熟悉形式逻辑,重要的是要理解这个语句“返回”即使对于一个空列表也是如此。这被称为空洞真相(如果你很好奇,请参见http://en.wikipedia.org/wiki/Vacuously_true。)
在空列表中返回true使得all'
更容易实现的事实是一个很好的例子,说明为什么空洞真理是一个好主意,但如果你想实现它以返回False
空列表所有你需要做的就是添加一个案例。
all' _ [] = False --here I have changed test to _ since we don't care what it is
all' test x:[] = test x --the new case
all' test (x:xs)
| not (test x) = False
| otherwise = all' test xs
答案 2 :(得分:2)
你也可以使用折叠来实现它,如下所示:
all' test = foldr (&&) True . map test
你基本上可以想象这是将“和”(&&
)应用于每对布尔值,第一个布尔值为True
。如果第一个是False
,则all
将返回False
,无论输入是由于&&
的性质(任何 anded 与{{} 1}}是False
。)
有关折叠如何工作的详细信息,请参阅Learn You a Haskell并滚动至“仅折叠和匹马”。