我刚刚接触 Haskell,我一直在浏览网站上的《Learn you a Haskell》一书。现在我正在学习高阶函数章节。
作者讲了实现自定义地图功能。我想用我所掌握的一点点知识来实现它,然后与作者进行比较。我使用了列表理解,而作者使用了递归。与标准库相同
-- me
map1 :: (t -> a) -> [t] -> [a]
map1 f xs = [f x | x<-xs]
-- author
map2 :: (t -> a) -> [t] -> [a]
map2 _ [] = []
map2 f (x:xs) = f x : map2 f xs
为什么选择递归高于列表理解?它的性能更高吗?
只是想知道为什么事情是这样的?
这里没有什么特别深刻的事情。在任何合理的 Haskell 实现中,这两个实现应该本质上相同。
不过,使用递归和模式匹配的版本确实有一些优点。
map
和其他类似函数的调用,或者直接递归定义是非常合理的。