1

我有一个功能f :: (a -> a) -> a -> ((a -> a), a)。(在特定情况下aInt,但这无关紧要。)

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

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

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

4

2 回答 2

3

你可能喜欢mapM。下面我给它它的类型,该类型的特化,特化类型的新类型展开,以及进一步的特化。您应该对最终类型非常熟悉。我用~::非正式的意思是“大约有那种类型”。

mapM  :: Monad m => (a -> m b) -> [a] -> m [b]
mapM  :: (a -> State s b) -> [a] -> State s [b]
mapM ~:: (a -> s -> (s, b)) -> [a] -> s -> (s, [b])
mapM ~:: (a -> (a -> a) -> (a -> a, a)) -> [a] -> (a -> a) -> (a -> a, [a])

最后一种类型准确地描述了您想要做什么:它可以采用(稍作修改)f、、inputsinitial作为参数,并生成输出列表(以及一些辅助信息)。

于 2016-05-12T21:47:37.653 回答
0

对我来说听起来 scanl可能会有所帮助:

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

要从结果列表中删除初始元素(始终比输入列表长 1),请将 atail应用于结果。

于 2016-05-12T22:04:57.790 回答