Haskell勉強会#5に行ってきました
参加者の皆さん、お疲れ様でした。ガラムの旬の野菜カレー、野菜たっぷりでおいしゅうございました。
さて今日の演習の課題。標準入力から読み込んで、各行を60文字ずつ改行して、標準出力に出力するプログラムです。interact便利です。
module Main (main) where foldLine :: String -> [String] foldLine [] = [] foldLine l = let (s, t) = splitAt 60 l in s : foldLine t main :: IO () main = interact (unlines . concatMap foldLine . lines)
Cohiで書くとこんな感じかな。Rubyは文字列をそのまま配列として使えないのが痛いです。map_ca、map_csで文字列⇔配列の変換をするようにしてみました。それ以外はだいぶHaskellぽいです。
require 'cohi' require 'cohi/prelude' require 'enumerator' include Cohi define(:map_ca) do |ls| map[lambda {|l| Enumerable::Enumerator.new(l, :each_byte).to_a }, ls] end define(:map_cs) do |as| map[lambda {|a| a.map {|c| c.chr }.join }, as] end define(:fold_line, [[]]) do [] end define(:fold_line) do |l| s, t = split_at[60, l] [s] + fold_line[t] end interact[unlines * map_cs * curry(concat_map, fold_line) * map_ca * lines]