2010-12-02 13 views
2

最終的な結果が得られるまで一連の操作を適用したい値のリストがあるとしましょう:Haskellで一連の操作(関数)を実行するには?

[0, 1, 2] 

firstOperation xs = map (+1) xs 
secondOperation xs = filter even xs 
thirdOperation xs = sum xs 

これを処理する他のより良い方法があると確信していますが、

しかし、これは両方とも醜いものであり、10の操作を行うと、このビットのコードをmaintananceの悪夢に変えてしまうという問題が生じます。

ここに何かを実装する正しい方法は何ですか?上記の例は、私の現在のプロジェクトで直面していることを単純化したものです。

+0

私はあなたのコードスニペットを見ると、私はあなたが入力に適用する変換を参照してください。操作はどこですか?ヒント:私は、あなたが間違った方法でハスケルを考えていると思うので、それを理解することなく間違った質問をしていると思います。 –

+0

私もそうだと信じています。残念ながら:( –

答えて

3

あなたはすべての操作のリストを作ることができる場合は、そのリストの上に組成演算子を折り畳むことができるが:

foldr (.) id fns 

次にあなたが初期値にその結果を適用することができます。

最終的な削減手順を別途適用する必要があるかもしれませんが、

+0

すべての操作が同じ型( '[a] - > [a]'、 '[a] - > [b]'のようなもの)でない場合のみ – ephemient

+0

[a] - > [b] - > [c](上の例のように、最終結果がスカラーの場合)? –

+0

@ephemient:そうです、そうでなければ、それらをすべて1つのリストにまとめるつもりです。 –

6

.または$が道より読み(以上であり、)

runAllOperations xs = thirdOperation $ secondOperation $ firstOperation xs 

または

runAllOperations = thirdOperation . secondOperation . firstOperation 
+0

+1は(。)ですが、$は常に(と)よりも良いとは思いません。 – Martijn

関連する問題