在foldr向Haskell新手解释时,规范定义是
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
Run Code Online (Sandbox Code Playgroud)
但在GHC.Base中,foldr定义为
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
Run Code Online (Sandbox Code Playgroud)
看起来这个定义是对速度的优化,但我不明白为什么使用辅助函数go会使它更快.源评论(见这里)提到了内联,但我也没有看到这个定义如何改进内联.
我正在编写一个模板类,它调用一个哈希函数,该函数将一个指向对象的指针和该对象的大小作为参数.
例如,如果item是类型int,则调用将是.
MurmurHash2(&item, sizeof(item), seed);
但如果item是std::string,我们将不得不这样做
MurmurHash2(item.c_str(), item.size(), seed);
编写此代码的最简洁方法是什么,以便它可以处理尽可能多的类型?