当条件为真时,我试图从列表中选择一些列表,如下所示:
我已经建立了数据结构 - > 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"]]
任何帮助都会很高兴。
提前致谢。
答案 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