局所的な定義と where 節

ある関数の内部で別の関数が評価されるとき,もしその内部の関数がプログラムのほかのどの部分でも評価されないなら−−言い換えればその場でしか使われないなら,その関数を局所的な定義にすることができる。局所的に定義された関数はプログラムのほかの部分からは見えなくなる。
局所的な定義はインデントを下げて where と書いたあとに続けて通常の関数定義と同じように書く。
where 以降を where 節という。


というわけで Capitalize をこうしてみた(関数名は先頭に大文字を使えないから capitalize)。

 import Data.Char

 capitalize []     = []
 capitalize (c:cs) = (toUpper c):(lower cs)
     where lower []     = []
           lower (c:cs) = (toLower c):(lower cs)

先頭の文字だけ大文字にして,2文字目以降は局所的に定義された lower を適用している。where 以降が lower の定義。


実行結果。

 *Main> capitalize "haskell"
 "Haskell"


追記:
map を使えば lower なんて関数を定義しなくてもすむ。

 capitalize []     = []
 capitalize (c:cs) = (toUpper c):(map toLower cs)
 *Main> capitalize "haskell"
 "Haskell"