Haskell 函数 iter 结果

标签 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..]?

最佳答案

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/

相关文章:

haskell - haskell 中的类型类依赖和 OOP 中的子类型有什么区别?

java - 将两个 CompletableFutures 链接在一起,每个 CompletableFutures 返回列表

javascript - 如何用更合适的 lodash 函数替换嵌套的 foreach 循环?

data-structures - 我应该使用 Clojure 的手指树做什么?

clojure - 如何映射将 5 添加到其参数的函数?

haskell HIP : Apply Filter to an Image

haskell - 部分 - 为什么我需要反引号?

haskell - 模式匹配 - Prolog vs. Haskell

haskell - 在 Haskell 中使用 OpenGL 渲染 PNG 图像

functional-programming - 使用函数式语言实现命令行解释器