【问题标题】:Haskell - Checking if a list contains an element atleast N timesHaskell - 检查列表是否包含至少 N 次元素
【发布时间】:2022-01-22 21:27:45
【问题描述】:

我正在编写一个函数来检查列表是否至少包含 N 次元素

atLeastNtimes :: Eq a => Int -> a -> [a] -> Bool
atLeastNtimes n a l = n <= (sum [1 | x <- l, (x == a)])

它适用于有限列表,但我正在努力使其适用于无限列表,例如:

atLeastNtimes 100 'a' (repeat 'a') 

【问题讨论】:

    标签: haskell functional-programming list-comprehension


    【解决方案1】:

    以下是一些可能的替代方法:

    • 递归地定义您的函数,无需尝试检查完整列表,而只检查所需的前缀。

    • filter列表开始,以便只保留您想要计算的元素。然后,使用drop (n-1) xs 删除n-1 元素(如果有),并检查结果列表是否不为空(使用null)。注意dropping 的元素多于列表中的元素不是错误,它会导致列表为空。

    【讨论】:

    • 谢谢@chi! atLeastNtimes n a l = not $ null $ drop (n-1) (filter (==a) l) 工作得很好
    • atLeastNtimes n a = not . null . drop (n - 1) . filter (== a)
    【解决方案2】:

    我们可以把问题分成两部分。第一个只是检查列表是否足够长。

    -- | Check whether the length of a list
    -- is at least a certain value.
    lengthAtLeast :: Int -> [a] -> Bool
    lengthAtLeast n0 xs0 = foldr go stop xs0 n0
      where
        stop n = n <= 0
    
        go _ _ n | n <= 0 = True
        go _ r n = r (n - 1)
    

    第二个是过滤,filter 为您完成。所以

    atLeastNtimes :: Eq a => Int -> a -> [a] -> Bool
    atLeastNtimes n a = lengthAtLeast n . filter (a ==)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-14
      • 2021-10-21
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 2014-07-31
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多