Haskell中的Map和Filter

3
这里是我的问题:我有两个列表如下:[(Float, Integer)][(String, Integer)]。现在我需要定义一个函数,它接受这两个列表和两个Float值,并返回一个Strings列表。这两个Float值对应给定范围(最小和最大)。我必须过滤第一个列表,以便它只包含在最小和最大范围内的元素。然后,我需要使用筛选后的列表并获取其Integer值,将其与第二个列表中的Integer值进行匹配,并返回所有匹配的String值。
我已经定义了一个用作筛选条件的函数,它接受一个(Float,Integer)并检查Float值是否在给定范围内。
我还定义了一个函数,它接受一个(String,Integer)元素并返回String
我只是在链接一切或者可能我漏掉了什么!
1个回答

3
您需要(例如,有不同的方式)
integersFromRange :: Float -> Float -> [(Float,Integer)] -> [Integer]
stringsFromInteger :: Integer -> [(String,Integer)] -> [String]

integersFromRange基本上是map snd . filter condition,其中condition由两个Float构建而成。 stringsFromInteger可以实现为map fst . filter condition。然后你可以使用这些函数组合。

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

使用 Integer 集合而不是列表会更有效率,因为在 Set 中进行成员测试比在列表中更快。


啊,我想我找到了一个错误...我的过滤条件只接受单个元素,即(Float,Integer),所以当我尝试传递列表[(Float,Integer)]时,我会遇到错误。这就是它的样子:check ::(Float,Integer)-> Float-> Float-> Bool check b min max = if ((fst b)> = min && (fst b) <= max) 然后为真 否则为假 - gdrules
哇,那个起作用了。好吧,我已经让integersFromRange工作了,尽管我对stringsFromInteger有点困惑——当你说过滤条件时,你是指不同的过滤条件,对吗? - gdrules
是的,我通用了名称“condition”,具体使用哪个条件取决于任务和类型。 - Daniel Fischer
当然,我已经定义了自己的函数并且它现在可以工作。虽然我的最终结果函数不起作用 - 对于结果函数来说,是否需要 's? - gdrules
1
result 不是一个函数,只是一个 String 列表。如果我理解你的问题正确,那么这些不是撇号而是反引号,可以用于中缀应用函数,例如 3 \elem` [1 .. 10]而不是elem 3 [1 .. 10]。因此,它们是必要的,因为给出的是 stringsFromInteger的第二个参数,而不是第一个(但你也可以使用flip,如 flip stringsFromInteger stringList`)。 - Daniel Fischer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接