Haskell函数迭代结果

时间:2019-05-29 14:23:28

标签: haskell functional-programming

我是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 ..]?

1 个答案:

答案 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