[language] Haskell惰性的一个极佳的例子

jamcode 2011-09-04
前天看到一段Haskell代码,
生成一个无限的Fibonaci数组

fibs = 1:1:zipWith (+) fibs (tail fibs)


--输出第10个fibnaci数
print fibs!!9


一般的函数递归调用都需要设边界条件,比如典型的quick sort代码:
--边界条件是空数组返回其自身
qksort []=[]
qksort (x:xs)=(qksort $ filter (<= x) xs) ++ [x] ++ (qksort $ filter (>x) xs)


但是这个fibs函数没有设置边界条件递归调用,即可生成一个无限长的list,不得不让人惊讶于惰性求值原来可以这样使用

同样的另外一段,最简单的repeat函数即是这样实现的
repeat x=x:repeat x


在Haskell中,真不能用命令式的思维去思考,不然这样的代码会令人想不通


4SEO:http://www.jamcode.org/
jamcode 2011-09-04
顺便带上,生成无限fibonaci数列用iterate,免去声明函数,
map fst $ iterate (\(a,b)->(b,a+b)) (1,2)

Global site tag (gtag.js) - Google Analytics