2012-02-13 74 views
3

这是我的问题:我有两个名单如下:[(Float, Integer)][(String, Integer)]。现在我需要定义一个函数,它需要这两个列表和两个值,并返回一个列表Strings。两个浮点值对应于给定的范围(最小值和最大值)。我必须过滤第一个列表,使其只包含在最小和最大范围内的元素。然后,我需要使用已过滤的列表并将其取值为Integer,并将它们与第二个列表中的Integer值进行匹配,并返回匹配的所有String值。哈斯克尔地图和过滤器

我已经定义了一个函数用作过滤条件,它需要(Float,Integer)并检查Float值以查看它是否在给定范围内。

而且我已经定义了一个函数,取一个(String,Integer)元素并返回String

我只是有问题连接在一起的一切,或者我失去了一些东西!

回答

3

您需要(例如,有不同的方式)

integersFromRange :: Float -> Float -> [(Float,Integer)] -> [Integer] 
stringsFromInteger :: Integer -> [(String,Integer)] -> [String] 

integersFromRange基本map snd . filter condition,从两个Float S(你有)构建conditionstringsFromInteger可以实现为map fst . filter condition。然后你

result = concatMap (`stringsFromInteger` stringList) (integerFromRange mini maxi floatList) 

使用一套Integer s,而不是一个列表会更有效,因为在Set成员测试比列表更快的结合的功能。

+0

啊我觉得我发现了一个我犯的错误...我的过滤条件采用一个单一的元素,即(浮动,整数),所以当我试图通过它的名单[(浮动,整数) ]我收到错误。这就是它的样子:check ::(Float,Integer) - > Float - > Float - > Bool check b min max = if((fst b)> = min &&(fst b)<= max) 那么真 其他错假 – gdrules 2012-02-13 12:34:23

+0

嗯,虽然我不知道如何克服这个过滤条件不应该列表,它应该检查单个元素? – gdrules 2012-02-13 12:43:07

+0

更改参数的顺序:check2 :: Float - > Float - >(Float,integer) - > Bool',然后用'filter(check2 mini maxi)'过滤。部分应用FTW。 – 2012-02-13 12:46:12