【问题标题】:Verifying condition in Haskell在 Haskell 中验证条件
【发布时间】:2015-01-16 15:26:37
【问题描述】:

我需要一个检查列表条件的函数。

例如:

countP :: [a] -> (a -> Bool) -> Int

输入:

countP [1,-2,0,-1,5] (>0)

应该返回 2,因为有两个大于零的数字。

这是我到目前为止所做的:

countP :: [a] -> (a -> Bool) -> Int
countP [] _ = []
countP (x:xs) condition = if condition x then 1:countP xs condition else countP xs condition 

它返回 [1,1] 而不是数字二。它必须是递归的。

我该怎么做?

【问题讨论】:

  • 你坚持手工做吗?因为你可以使用filterlength

标签: list haskell recursion


【解决方案1】:

你必须像这样添加结果

countP :: [a] -> (a -> Bool) -> Int
countP [] _ = 0
countP (x:xs) condition = (if condition x then 1 else 0) + (countP xs condition)

只要condition x 的计算结果为 True,我们就使用1,否则使用0,我们递归调用countP 并添加它们。

所以,当你像这样调用它时

countP [1, -2, 0, -1, 5] (>0)

它将被评估递归,像这样

(if (> 0) 1 then 1 else 0) + (countP [-2, 0, -1, 5] (> 0))
1 + (countP [-2, 0, -1, 5] (> 0))
1 + (if (> 0) -1 then 1 else 0) + (countP [0, -1, 5] (> 0))
1 + 0 + (countP [0, -1, 5] (> 0))
1 + 0 + 0 + (countP [-1, 5] (> 0))
1 + 0 + 0 + 0 + (countP [5] (> 0))
1 + 0 + 0 + 0 + 1 + (countP [] (> 0))
1 + 0 + 0 + 0 + 1 + 0 = 2

(countP [] (> 0)) 被评估为0,因为我们的递归函数countP [] _ = 0基本条件。意思就是不管第二个参数是什么,如果第一个参数是空列表,则返回0。

【讨论】:

    【解决方案2】:

    你似乎想多了。您可以使用 Prelude 提供的一些函数并组合它们来产生结果:

    length $ filter (>0) [1,-2,0,-1,5]
    

    length 会列出一个列表并告诉你它有多长。 filter 接受一个谓词并告诉您提供的列表中有多少元素与该谓词匹配。 因此,如果您获得了filtered 列表中的length,那么您就设置好了。

    countP xs f = length $ filter f xs
    

    【讨论】:

      【解决方案3】:

      有一个专门用于计算列表中事物数量的函数,称为length。你可以做类似的事情

      countP' [] _ = []
      countP' (x:xs) condition = if condition x then 1 : countP' xs condition else countP' xs condition
      
      countP xs condition = length (countP' xs condition)
      

      但是,这需要两个函数,并且会做额外的工作。相反,您可以直接使用Ints 而不是[Int]s:

      countP :: [a] -> (a -> Bool) -> Int
      countP [] _ = 0
      countP (x:xs) condition = ...
      

      我还是让你在这里填空,知道你已经拥有的距离正确的解决方案并不远。

      但是,如果我要在项目中实现此代码,我会直接使用 lengthfilter

      countP xs condition = length (filter condition xs)
      

      这就是我所说的惯用定义(直到参数顺序)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多