我的结构定义如下:
type P = [(Int, Int)]
Run Code Online (Sandbox Code Playgroud)
我需要从该结构的列表中创建一个函数,如果满足以下条件,则添加元组中第一个位置的项:元组的第二个元素是相同的.
add :: [P] -> P
add lists = ......
Run Code Online (Sandbox Code Playgroud)
例如
add [[(1,2), (3,0)], [(3,1), (7,0)]]
Run Code Online (Sandbox Code Playgroud)
结果将是[(1,2), (3,1), (10.0)].
因为它只会添加元组(3.0)和(7.0),因为它匹配0.
这是一个"键控"操作,可以在标准库的帮助下轻松解决.
import qualified Data.Map as M
Run Code Online (Sandbox Code Playgroud)
Data.Map实现有限关联映射 - 即M.Map k a具有一组类型的键k,并且每个键关联一个类型的值a.
这类问题非常有用的功能是fromListWith:
M.fromListWith :: (a -> a -> a) -> [(k,a)] -> M.Map k a
Run Code Online (Sandbox Code Playgroud)
第二个参数,即(k,a)元组列表,只是关联,将给定键与给定值相关联.第一个参数是组合函数,它表示如果列表中出现重复键,该如何对值进行操作.
您还必须使用M.toList :: M.Map k a -> [(k,a)] 它来返回存储在Map中的关联列表.这是一个例子:
ghci> M.toList (M.fromListWith (+) [(1,2), (2,3), (1,4), (3,5)])
[(1,6),(2,3),(3,5)]
Run Code Online (Sandbox Code Playgroud)
注意键是元组的第一个元素,与你如何陈述问题相反.我们结合(1,2)及(1,4)成(1,6).我们添加了因为我们给了组合功能(+).
这一功能解决了你的问题首当其冲 - 剩下的只是一点管道,我会留给你.
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |