改进我所有函数的Haskell代码

时间:2013-11-30 19:40:48

标签: list haskell predicate

我正在尝试在Haskell中实现所有函数,它工作正常,但我认为我的基本情况不好,如果我将基本情况的结果设置为False它更有意义,我的意思不是一个成员空列表以真实单词传递测试条件,因此答案应为false,但另一方面,如果我将其定义为false,则整个函数无法正常工作。

all' test [] = True 
all' test (x:xs)
    | not (test x) = False
    | otherwise = all' test xs

3 个答案:

答案 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并滚动至“仅折叠和匹马”。