あるリストの各要素をある処理を経て他のリストへ入れたい時。

例えば『空白区切りで並んだ数値文字列の合計を算出して、それをリストに格納したい』時。
以下のような処理を行う。

-- 仮に結果を単精度浮動小数点数としておく。
plus :: String -> [Float]
plus = foldl f [] . words -- (1)
    where
        f (x:xs) d = (x + (read d)) : xs -- (2)
        f xs d = read d : xs -- (3)

※foldlは初期値を先頭として、配列要素の前から順番に処理していく関数。foldrの逆。
(1):wordsは空白文字をデリミタとして文字列を分割し、それぞれを要素とするリストを生成する関数。
これによって処理対象のリストを生成する。
そしてfoldlを使い、第一引数に関数f、第二引数に初期値として結果格納用の[]を指定する。
(2):(x:xs)とする事で、fの第一引数であるFloat型リストの一つしかない要素と空リストに分割する。
そして必要な計算をした後に再びリストの中に入れる。
(3):fの第一引数であるFloat型リストが空の場合ここにマッチする。
この場合、第二引数をreadして数値に変えてからFloat型リストへ格納する。


Haskellのコーディング練習として逆ポーランド記法電卓を作ろうとしてたら行き詰まってしまい、どうしたもんかとググったら即見つかったコードから得られた物を簡単にまとめてみました。
とにかくfoldl/foldr/map/filterやwordsなんかの『よくある再帰処理』を関数化した関数を積極的に利用していかないと、コーディング量が増えるばかりか本質が見えなくなって失敗する原因になるという事が分かりました。
Haskell98 言語仕様 : http://www.haskell.org/onlinelibrary/index.html