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]