【问题标题】:How do I use the filter function in Haskell?如何使用 Haskell 中的过滤器功能?
【发布时间】:2012-01-03 12:19:52
【问题描述】:

我有一个 haskell 程序,可以根据输入 n 列出 [1..n] 中的所有整数。 我想根据其中的条件过滤某些数字并显示为列表。我在哪里以及如何使用过滤功能/条件?

根据haskell文档:

filter :: (a -> Bool) -> [a] -> [a]

filter,应用于谓词和列表,返回满足谓词的那些元素的列表;即,

filter p xs = [ x | x <- xs, p x]

【问题讨论】:

    标签: function haskell


    【解决方案1】:

    你明白了,差不多。所以剩下的事情就是为你的列表设计谓词函数。假设您已经有一个名为 xs 的列表和一个谓词函数 p,那么您所要做的就是

    filter p xs.
    

    通常,您会看到 p 被定义为匿名或 lambda 表达式,如下所示:

    filter (\n -> n \`mod\` 2 == 0) xs.
    

    这不是必须的,作为初学者定义命名函数可能会有所帮助。

    isEven n = n \`mod\` 2 == 0
    
    evenListNumbers xs = filter isEven xs
    
    evenListNumbers [1,2,3,4]
    

    这是[2,4]

    因此,给定列表过滤器的谓词函数接受一个列表元素并返回一个布尔值。如果为真,则保留该元素(或添加到结果列表中),如果为假,则将其传递过去。

    【讨论】:

    • 谢谢!解释得很清楚。我知道如何过滤偶数和奇数,但是过滤那些可以划分输入 n 的数字呢?类似 isDivisible n = filter [1..n] div n?那是什么语法? :S
    • 您必须按照以下方式创建一个函数:isDivisible n p = n `mod` p == 0 并将其用作您的谓词。请注意,如果 n 除以 p 的余数为零,则此函数返回 true,否则返回 false。请注意,参数现在的顺序与您想要的顺序略有不同,因此您现在可能只想在定义中翻转它们,或使用flip
    • 出现错误,不确定在哪里定义此谓词。我想我不能在过滤器的同一行中使用它,对吗?我希望程序获得输入并列出其所有除数。我想知道如何为此定义谓词。谢谢。
    • 如果您想知道如何找到给定数字的所有除数,您应该专门提出一个新问题。要查找列表中可被给定数字整除的所有数字,有一种方法:filter (\n -&gt; n `mod` 4 == 0) list 其中 list 是您要过滤的列表。此函数将返回列表中可被四整除的数字列表。
    • 请注意,您也可以事先定义 divisibleByFour n = n `mod` 4 == 0 并将其作为谓词进行过滤,但您是对的 - 与过滤器不在同一行。
    【解决方案2】:

    好吧,您可以将该条件转换为谓词(返回 Bool 的函数)并使用它来过滤数字。

    例如,如果你必须只选择奇数,你可以使用filter odd [1..n]

    【讨论】:

    • 你的意思是我必须定义要与过滤器一起使用的谓词,它是一个函数 Int -> Bool,它作为第一个参数传递给过滤器。我该怎么做?那是我的问题。例如:如何列出我输入的整数的所有除数。
    • 是的,您需要Int -&gt; Bool 类型的函数。您列出输入数字除数的第二个示例不能以这种方式工作。因为从单个数字中您可以获得除数列表,因此您的函数将具有类型Int -&gt; [Int],它与Int -&gt; Bool 不同。在这种情况下,也许mapconcatMap 是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2016-01-28
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多