Haskell:当条件为真时从列表中选择列表

时间:2012-01-09 16:33:19

标签: list haskell select

当条件为真时,我试图从列表中选择一些列表,如下所示:

我已经建立了数据结构 - > data File = File {name :: String, size :: Integer, comment :: String} deriving Show

我已经创建了一个包含此结构的所有文件的库:

  

files = [[" name1",size1," coment1"],[" name2",size2," coment2"], [" NAME3",size3," coment3"],...]

现在我需要的是一个函数,它选择了所有大小为例如> = 500的列表,类似

list = select ((>=500.size) files)

所以,如果我有:

files = [["asd",345,"coment1"],["fgh",678,"coment2"],["hjk",123,"coment3"],...]

我会得到:

list = [["fgh",678,"coment2"]]

任何帮助都会很高兴。

提前致谢。

3 个答案:

答案 0 :(得分:5)

Prelude包含有用的

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

执行您select要执行的操作。

回答你对Jon Purdy回答的评论:

filter ((>= 500) . size) files

除了:

files = [["asd",345,"coment1"],["fgh",678,"coment2"],["hjk",123,"coment3"],...]

不起作用,列表是同质的。它应该在问题的背景下

files = [File "asd" 345 "coment1", File "fgh" 678 "coment2", ... ]
已经使用记录语法定义了

File,您可以将它与记录语法或vanilla位置语法一起使用,无论在给定情况下哪种情况更好。记录语法比上面的语法输入更多,但如果您使用它,files = [File{ name = "asd", size = 345, comment = "coment1" }, ... ]将继续工作,如果您向该类型添加字段 - 添加的字段将使用undefined实例化,这可能或可能没有比没有更改时编译的代码更好。

答案 1 :(得分:3)

你想要filter :: (a -> Bool) -> [a] -> [a],它位于Prelude。

A quick Hoogle query将帮助您在将来找到类似的内容。

答案 2 :(得分:1)

使用类似

的输入文件
data File = File {name :: String, size :: Integer, comment :: String}
          deriving Show

files = [File "asd" 345 "coment1",
         File "fgh" 678 "coment2",
         File "hjk" 123 "coment3"]

然后你可以使用

filter :: (a -> Bool) -> [a] -> [a]
像这样得到你想要的东西:

filter ((>= 500) . size) files