performance - 使用toList不好吗?

标签 performance list haskell containers

假设有2张 map

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的情况下有效地编写combi?

最佳答案

在 map 上使用foldintersectWith更加优雅(可能更快):

combi :: M.Map Int Float -> M.Map Int Float -> Float
combi x y = M.fold (+) 0 $ M.intersectionWith (*) x y
combi sparse1 sparse2根据需要返回414.0

而且,如果您关心性能,请尝试使用Data.IntMap:它应该比Data.Map快几倍。

关于performance - 使用toList不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860134/

相关文章:

include/require 内部条件的 PHP 行为

c# - 嵌套产量在树中的表现

python - 如何将多个整数列表转换为单个整数?

python - 获取 map 返回所有 T/F 值以进行列表匹配

haskell - 如何 'show' 无法显示的类型?

c++ - 为什么 std::ios_base::sync_with_stdio 没有在 libc++ (clang) 中实现?

java - 适用于高流量网站的 Play Framework、Java、Apache、PostgreSQL、JPA 和 Hibernate

c - *****double 的合适替代品

linux - 如何在Linux上的2018年安装Haskell(平台或堆栈)?

haskell - 基本 haskell 应用程序中的错误 "empty certificate chain"