我正在学习 Haskell 编程,我试图理解列表是如何工作的,因此我尝试编写两个可能的length
功能:
myLength :: [a] -> Integer
myLength = foldr (\x -> (+) 1) 0
myLength1 :: [a] -> Integer
myLength1 [] = 0
myLength1 (x:xs) = (+1) (myLength1 xs)
哪一个更好?
从我的观点,myLength1
更容易理解,并且对于列表操作看起来很自然。
另一方面,myLength
更短并且不使用递归;这是否意味着myLength
运行速度比myLength1
?
记住这个“伪实现”foldr
:
foldr :: function -> initializer -> [a] -> b
foldr _ i [] = i
foldr f i (x:xs) = x `f` (foldr f i xs)
现在我们有了您的代码
myLength :: [a] -> Integer
myLength = foldr (\x -> (+) 1) 0
myLength1 :: [a] -> Integer
myLength1 [] = 0
myLength1 (x:xs) = (+1) (myLength1 xs)
Since foldr
本身也是递归的,您的 myLength1 和 myLength 几乎相同,但在第一种情况下,递归调用是由 Foldr 完成的,而不是由您自己显式完成的。他们应该大约在同一时间运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)