Haskell 如何使用以前的输出作为参数在列表上应用函数?

Haskell 如何使用以前的输出作为参数在列表上应用函数?,haskell,fold,iterated-function,Haskell,Fold,Iterated Function,我有一个函数f::(a->a)->a->((a->a),a)。(在特定情况下,a为Int,但这与此无关。) 我有一个函数initial::a->a,和一个输入列表(输入::[a]) 我需要将f应用于输入的所有元素,但是,对于每个元素,我需要将上一次迭代输出的fst部分作为下一次迭代输入的(a->a)部分。作为输出,我需要一个类型列表[a],它是每个迭代输出的snd部分 如何递归地将f应用于输出的fst部分和输入的元素,同时建立输出的中间snd部分的列表?您可能喜欢mapM。下面我给出它的类型,该

我有一个函数
f::(a->a)->a->((a->a),a)
。(在特定情况下,
a
Int
,但这与此无关。)

我有一个函数
initial::a->a
,和一个输入列表(
输入::[a]

我需要将
f
应用于
输入的所有元素,但是,对于每个元素,我需要将上一次迭代输出的
fst
部分作为下一次迭代输入的
(a->a)
部分。作为输出,我需要一个类型列表
[a]
,它是每个迭代输出的
snd
部分


如何递归地将
f
应用于输出的
fst
部分和
输入的元素,同时建立输出的中间
snd
部分的列表?

您可能喜欢
mapM
。下面我给出它的类型,该类型的专门化,专门化类型的新类型展开,以及进一步的专门化。最后一种类型对您来说应该很熟悉。我用
~::
非正式的意思是“大概有这个类型”


最后一种类型准确地描述了您要执行的操作:它可以将(稍微修改的)
f
输入
、和
初始
作为参数,并生成输出列表(以及一些辅助信息)。

听起来像
scanl
可以帮助:

scanl g (initial, undefined) xs
  where g (i,_) a = f i a

要从结果列表中删除初始元素(始终比输入列表长1个),请在结果上应用
尾部

您已经尝试了什么-到目前为止,这听起来像是一个家庭作业/练习-我们将为您做。告诉我们你的尝试失败的地方a)不包含破坏者,b)为高级Haskeller提供洞察,也许在前面抛出一个
tail
可以消除空列表的危险。事实上,scanl返回的列表总是比输入列表长1个元素。
scanl g (initial, undefined) xs
  where g (i,_) a = f i a