这两个函数都是从learnyouahaskell中提取的字典查找的实现
findKeyPatMatch :: (Eq k) => k -> [(k,v)] -> Maybe v
findKeyPatMatch key [] = Nothing
findKeyPatMatch key ((k,v):xs)
| key == k = Just v
| otherwise = findKeyPatMatch key xs
findKeyFold :: (Eq k) => k -> [(k,v)] -> Maybe v
findKeyFold key = foldr (\(k,v) acc -> if k == key then Just v else acc) Nothing
由于第一个功能中的模式是针对确切的成语文件夹进行的,因此我希望这两个功能都具有相同的性能。但是,模式匹配实现明显更快。
foldr
短路,所以我想不出任何特殊原因,除了可能是函数调用开销之外。
testKey = 10^7
testDict = [(i,i) | i <- [1..]]
findKeyPatMatch testKey testDict -- takes ~3.40 s
findKeyFold testKey testDict -- takes ~4.10 s
所以我的问题是-性能差异的原因是什么,并且有什么方法可以优化文件夹表达。