在两个列表之间过滤Haskell

chhkpiq4  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(62)

我正在做一个练习,我能想到的唯一解决方案是使用一个列表来过滤另一个列表。
练习内容如下:
使用组合(.)summapfilter定义一个函数walletValue :: [(String,Double)] -> [(String,Double)] -> Double,该函数给定一个值钱包(表示为带有标题名称及其金额的对列表),计算给定引用的值(表示为带有标题名称及其值的对列表)。举例来说:

quote= [("apple", 116), ("intel", 35), ("google", 824), ("nvidia", 67)]

>walletValue [("intel", 1), ("nvidia", 1)] quote
102.0

>walletValue [("intel", 3), ("nvidia", 2)] quote
239.0

>walletValue [("intel", 3), ("facebook", 4), ("nvidia", 2)] quote
239.0

我找到了一个解决方案,但没有实现与mapfilter的组合。我的解决方案:

walletValue:: [(String,Double)] -> [(String,Double)] -> Double
walletValue xs ys = sum.concat.(map (\(k,v)-> map (v*) (searchC k ys))) xs

searchC :: Eq a => a -> [(a,b)] -> [b]
searchC k xs = [ v | (k,v) <- xs,k==k']
gywdnpxw

gywdnpxw1#

您的searchC充当过滤器,但您没有将其编写为过滤器。事实上,你可以重写逻辑:

searchC :: Eq a => a -> [(a,b)] -> [b]
searchC k xs = [ v | (k,v) <- xs,k==k']

涉及通过使用两种模式的Map和过滤的组合。
第一个是我们可以重写:

[x | x <- xs, f x]

收件人:

filter (\x -> f x) xs

第二,如果列表解析的头部不是变量x,如这里的情况,通过重写:

[ f x | x <- xs ]

收件人:

map (\x -> f x) xs

相关问题