Arrowを使ってwcコマンドを実装してみました
Arrowを写経 - 趣味的にっきでArrowの写経をしてみました。次は実際に簡単なプログラムで使ってみよう。ということで、wcコマンドを実装してみました(意図的に無理矢理使っているような気もします)。
入力の文字列を単語数、行数、バイト数の3つのパイプに分けてそれぞれ計算します。最後に3つのパイプを合わせで文字列を作るところはタプルのパターンマッチを使っています。演算子じゃなくてパターンマッチっていうのが、いまひとつかっこ悪いのですが、何かいい方法ありませんかね?
module Main (main) where import Control.Arrow ((<<<), (&&&), (***)) wc :: String -> String wc = (\ (w, (l, b)) -> "\t" ++ w ++ "\t" ++ l ++ "\t" ++ b) <<< show *** show *** show <<< length *** length *** length <<< lines &&& words &&& id main :: IO () main = putStrLn . wc =<< getContents