5
假设2个地图使用toList不好吗?
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
使得sparse2返回COMBI sparse1 414.0(= 5 * 19 + 11 * 29),因为12和102是唯一的两张地图的共同钥匙?没有与名单优雅的(简单而有效的)功能,因为这些将严格下令:
combiList xs ys = cL xs ys 0
cL [] _ acc = acc
cL _ [] acc = acc
cL ([email protected](k,r):xs) ([email protected](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的情况下高效地编写combi?
我同意它更优雅,但速度更快吗?我不认为在GHC中,由Map.intersectionWith生成的地图和由Map.fold消耗的地图是融合的,因此如果有许多公用密钥,则此代码可能会变慢。 – 2010-10-05 18:53:38
在这种情况下,我们无法从'Data.Map'中获得非常好的性能。 'fold'和'intersectionWith'都是懒惰的,会导致额外的thunk被创建。 – tibbe 2011-04-28 13:08:51