💬
合成関数でリファクタリング
前回に書いたこのコードをリファクタリングします
Haskell
main::IO ()
main = putStrLn=<<id=<<(show.sum<$>).
(<$>((:[]).read<$>getLine))<$>
(:).read<$>(getLine::IO String)
以前に紹介したようにこれは「標準入力から読み込んだ2行の文字列を整数変換且つ加算後に標準出力へ表示する」プログラムです
以下はこれ改修したものです
Haskell
main::IO ()
main = ((<*>(read<$>getLine)) $
(+).read<$>getLine)>>=
putStrLn.show
関数合成の簡単なサンプルとなるよう、Haskellで基礎的な3つの合成関数を利用しています
$
は右辺で生成された値を左辺の関数の実引数として扱う関数です
.
は二つの関数を合成して一引数一戻り値の新たな関数を生成する関数です
<$>
は右辺で生成されたFanctotクラスのインスタンス、今回の例ではIO a
構造体の値からa
型の値を取得し、左辺の関数の実引数として扱う関数です
最終的な戻り値はFanctor型、すなはち今回の場合はIO b
に加工されて返されます
<*>
は左辺にApplecativeクラスのインスタンス、すなはち今回の例におけるIO (Int->Int)
のような関数をラップした構造体を引数に取り、<$>
と同様の動作を行う関数です
それぞれを組み合わせるとどれがどのような働きをしているのかが明瞭に可視化されます
各合成関数の説明を行う際のサンプルコードとしても有用です
Discussion