list - Haskell 得到一个过滤的整数列表

标签 list haskell filter

设想:
如果有一个整数数组,我想得到整数数组作为返回,它们的总数不应超过 10。

我是 Haskell 的初学者,并在下面尝试过。如果有人能纠正我,将不胜感激。

numbers :: [Int]
numbers = [1,2,3,4,5,6,7,8,9,10, 11, 12]

getUpTo :: [Int] -> Int -> [Int]
getUpTo (x:xs) max =
    if max <= 10
    then
            max = max + x
            getUpTo xs max
    else
            x

输入
getUpTo numbers 0

预期产出
[1,2,3,4]

最佳答案

当心:这不是背包问题的解决方案:)

我想出的一个非常快速的解决方案是以下一个。当然,解决完整的背包问题会更难,但如果您只需要一个快速的解决方案,这应该可行:

import Data.List (sort)

getUpTo :: Int -> [Int] -> [Int]
getUpTo max xs = go (sort xs) 0 []
    where
        go [] sum acc         = acc
        go (x:xs) sum acc
            | x + sum <= max  = go xs (x + sum) (x:acc)
            | otherwise       = acc

通过在其他所有事情之前对数组进行排序,我可以从顶部一个接一个地取出项目,直到超过最大值;然后返回建立到该点的列表。

编辑:作为旁注,我交换了前两个参数的顺序,因为这种方式对于部分应用程序应该更有用。

关于list - Haskell 得到一个过滤的整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9996495/

相关文章:

c# - Unity3D : List returns null when accessed from other class

python - 将文件中的不同列附加到不同的列表?

filter - 如何在 playframework 中应用全局过滤器

mongodb - 查找查询结果到List

string - 标记化文本中 ngram(字符串)的频率

haskell - 树声明之间的区别?

list - 在haskell中获取列表的排列?

list - 列表理解 Haskell 中的意外并行语句

android - 自定义 ArrayAdapter 过滤器没有结果

AngularJS - 用数字/长度过滤复选框