2016-05-12 84 views
1

我有一個功能f :: (a -> a) -> a -> ((a -> a), a)。 (在該特定情況下是aInt,但這是不相關的。)如何使用先前的輸出作爲參數在列表上應用函數?

我有一個函數initial :: a -> a,和的輸入列表(inputs :: [a])。

我需要申請finputs所有元素,但是,對於每一個,我需要上一次迭代的輸出fst部分並將其作爲輸入下一個的(a -> a)一部分。作爲輸出,我需要有一個[a]類型的列表,它是每個迭代的輸出的snd部分。

我如何可以遞歸f到輸出和inputs元素的fst一部分,同時建立了中間snd零件輸出的名單?

+4

你已經嘗試過什麼 - 截至目前這聽起來像一個家庭作業/練習 - 我們會爲你做的。我們在哪裏嘗試失敗 – epsilonhalbe

回答

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]) 

最後一類描述正是你想做的事:它可以採取的輸出(稍加修改)finputsinitial作爲參數,併產生列表(連同一些輔助信息)。

+0

a)不包含破壞者,以及b)爲高級haskellers提供洞察以及 – epsilonhalbe

0

聽起來好像scanl可以幫助:

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

要從結果列表的初始元素(這將永遠是1比輸入列表更長),適用於tail的結果。

+1

也許在前面展示「尾巴」將消除空列表的危險。 –

+0

的確,scanl返回的列表總是比輸入列表長1個元素。 – Ingo

相關問題