我正在做一个练习,我能想到的唯一解决方案是使用一个列表来过滤另一个列表。
练习内容如下:
使用组合(.)
,sum
,map
和filter
定义一个函数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
我找到了一个解决方案,但没有实现与map
和filter
的组合。我的解决方案:
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']
1条答案
按热度按时间gywdnpxw1#
您的
searchC
充当过滤器,但您没有将其编写为过滤器。事实上,你可以重写逻辑:涉及通过使用两种模式的Map和过滤的组合。
第一个是我们可以重写:
收件人:
第二,如果列表解析的头部不是变量
x
,如这里的情况,通过重写:收件人: