我刚刚进入Haskell,我一直在浏览网站上的《学习Haskell》一书。现在我在高阶函数一章。
作者谈到了实现一个自定义Map函数。我想用我所掌握的一点点知识来实现它,然后与作者进行比较。我使用了列表理解,而作者使用了递归。与标准库相同
-- 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
字符串
为什么选择递归在列表解析之上?它的性能更好吗?
只是想知道为什么事情会这样
1条答案
按热度按时间mrzz3bfm1#
这里没有什么特别深入的内容,在任何合理的Haskell实现中,这两个实现应该基本上是相同的。
不过,使用递归和模式匹配的版本确实有一些优点。
1.它使用了语言中“更原始”的部分。事实上,对于Haskell实现来说,在内部将列表解析转换为对
map
和其他类似函数的调用,或者直接递归定义,这是非常合理的。1.在标准的Haskell 2010中,没有列表解析式的语法糖用于其他数据类型,如树,数组,集合,字典等。但模式匹配可用于各种常见类型,递归在任何地方都很有用。
1.这是一个很好的教学方法。对于一些来自命令式背景的人来说,递归尤其陌生。此外,使用递归的实现将其函数参数沿着传递给另一个函数调用,利用Haskell支持函数作为第一类对象的事实。有些语言不支持这种干净的方式,所以看到,使用,对某些人来说,玩这个功能可能是一个绊脚石。