我是Haskell的新手,并且正在研究此功能的问题:
iter :: (t -> t) -> t -> [t]
iter f a = a : iter f (f a)
myList = iter (\x -> x + 2) 1
我对此的理解是:
iter接受两个参数(t-> t)和t并返回[t]的列表。
我对下一部分感到困惑
iter f a = a : iter f (f a)
是myList [1,3]还是我在以错误的方式考虑它?
还是[1,3,5,7 ..]?
答案 0 :(得分:6)
myList
确实代表了无限列表[1,3,..]
。但是,该列表是延迟生成的。仅在需要时才对iter
进行递归调用。考虑以myList
的首领:
head :: [a] -> a
head (x:_) = x
head myList == head (iter (\x -> x + 2) 1) -- definition of myList
== head (1 : iter (\x -> x + 2) ((\x -> x + 2) 1)) -- definition of iter
== 1 -- definition of head
由于iter
从未尝试消耗iter
的尾部,因此从未进行对head
的定义所指定的myList
的递归调用。
我会在这里注意到iter
实际上是 corecursive 函数的一个示例,而不是递归函数。 Haskell的非严格评估模糊了两者之间的区别。参见https://softwareengineering.stackexchange.com/q/144274/206609。