Jam*_*ong 2 haskell functional-programming
我是Haskell的新手,并且正在研究此功能的问题:
iter :: (t -> t) -> t -> [t]
iter f a = a : iter f (f a)
myList = iter (\x -> x + 2) 1
Run Code Online (Sandbox Code Playgroud)
我对此的理解是:
iter接受两个参数(t-> t)和t并返回[t]的列表。
我对下一部分感到困惑:
iter f a = a : iter f (f a)
Run Code Online (Sandbox Code Playgroud)
是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
Run Code Online (Sandbox Code Playgroud)
永远不会进行iter对的定义所指定的递归调用iter,因为head从不尝试消耗的尾部myList。
我会在这里注意到,这iter实际上是一个核心递归函数的示例,而不是递归函数。Haskell的非严格评估模糊了两者之间的区别。请参阅https://softwareengineering.stackexchange.com/q/144274/206609。