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