【发布时间】:2010-10-05 00:36:08
【问题描述】:
假设有 2 个地图
import qualified Data.Map as M
sparse1, sparse2 :: M.Map Int Float
sparse1 = M.fromList [(1,2.0),(10,3),(12,5),(100,7),(102,11)]
sparse2 = M.fromList [(2,13.0),(11,17),(12,19),(101,23),(102,29)]
如何定义优雅的函数
combi :: M.Map Int Float -> M.Map Int Float -> Float
combi sparse1 sparse2 返回 414.0 (= 5 * 19 + 11 * 29) 因为 12 和 102 是两个映射的唯一公共键?列表有一个优雅(简单而高效)的功能,因为它们将被严格排序:
combiList xs ys = cL xs ys 0
cL [] _ acc = acc
cL _ [] acc = acc
cL (x@(k,r):xs) (y@(k',r'):ys) acc
| k < k' = cL xs (y:ys) acc
| k == k' = cL xs ys (acc+r*r')
| k > k' = cL (x:xs) ys acc
但是
combi m1 m2 = combiList (M.toList m1) (M.toList m2)
知道在其余代码中不再使用列表是个好主意吗?如果没有,你将如何在没有 toList 的情况下有效地编写组合?
【问题讨论】:
标签: performance list haskell containers