2016-05-12 9 views
1

私には、関数f :: (a -> a) -> a -> ((a -> a), a)があります。 (特定の場合においてaIntであるが、それは無関係である。)前の出力を引数として関数をリストに適用する方法はありますか?

Iは機能initial :: a -> a、及び入力(inputs :: [a])のリストを持っています。

Iはそれぞれのために、私は前の反復の出力のfst一部を取り、次の入力の(a -> a)一部としてそれを供給する必要がある、inputsのすべての要素にfを適用する必要はなく、。出力としては、タイプ[a]のリストが必要です。これは、各繰り返しの出力の一部であるsndです。

出力の中間snd部品のリストを構築しながら、どのように再帰的に、出力のfst一部とinputsの要素にfを適用することができますか?

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

最後のタイプは、あなたがしたい正確に何を説明します。それは(わずかに変更された)fを取ることができ、inputs、引数としてinitial、および(一部の補助情報と一緒に)出力のリストを生成します。

+0

a)スポイラーを含まない、b)先進のハスケラーにも洞察を提供するための素晴らしい答え – epsilonhalbe

0

を助けることができるscanlのように私には聞こえ:

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

は(常に1長い入力リストよりになります)、結果リストから最初の要素を削除するには、結果にtailを適用します。

+1

おそらく空のリストの危険性を排除するために 'tail ' –

+0

実際、scanlは常に入力リストよりも1要素長いリストを返します。 – Ingo

関連する問題