我是 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..]?
最佳答案
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
永远不会尝试使用 的尾部>我的列表
。
我会在这里指出 iter
实际上是 corecursive 函数的一个例子,而不是递归函数。 Haskell 的非严格评估模糊了两者之间的区别。参见 https://softwareengineering.stackexchange.com/q/144274/206609 .
关于Haskell 函数 iter 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56362834/