数値のリストををcsvファイルに出力する
Text.CSV を使えば csv ファイルを書き出せるのですが、String の要素にしか対応していません。数値であっても一度 String に変換しないといけないので、コードも結果も不格好です。
import Text.CSV putStrLn . printCSV $ fmap (fmap show) [[1,2,3], [4,5,6]]
"1","2","3" "4","5","6"
そこで、数値を String に変換しないものを作ってみようと思います。
newtype Rec a = Rec [[a]] joint :: String -> [String] -> String joint = intercalate printRec :: Show a => Rec a -> String printRec (Rec xss) = joint "¥n" $ fmap (joint "," . fmap show) xss
joint を定義せずに intercalate のまま使っても良いのですが、どうも読んでいてしっくりこないのでこうしました。ためしてみましょう。
> putStrLn $ printRec (Rec [[1,2,3],[4,5,6]]) 1,2,3 4,5,6
良さそうです。ファイルに出力したければ、writeFile に喰わせてあげればOKです。今回は a -> String を show 関数に任せましたが、Text.Printf を使って書式を指定することもできると思います。
では。