sicplite #8 にいってきた

  • 遅刻をしました
    • 正直 Erlang Super Lite と間違えていた(来週です
      • もう脳からしErlang 脳になったと思ったのに(自己満足
  • 2.43 を考えていた
  • accumlate-n が RubyEnumerable::zip っぽい
    • accumulate-n を勘違いしていた → tree をmap っぽくするものだと
      • 普通に map (fold f) . zip でした
  • queens は,内部実装が違うくても他が違わないということでFA?
    • accumulate-n の関数引数の戻り値の型は,初期値の型と同じになる
  • Ruby の zip は,オブジェクト指向なのでレシーバ重視なのだな

Haskell だと accumulate-n は,こんな感じか?(脳内コンパイルなので動くか知りません

accumulate :: (a -> b -> a) -> a -> [b] -> a
accumulate = foldl

accumulate_n :: (a -> b -> a) -> a -> [[b]] -> [a]
-- accumulate_n f ini xs | any null xs = []
--                       | otherwise = accumulate f ini (map head xs) 
--                                     : accumulate_n f ini (map tail xs)
accumulate_n f ini xs = map (\xs -> foldl f ini xs) (tr xs)
  where tr xs | any null xs = []
              | otherwise   = map head xs : tr (map tail xs)

Haskell 実行例

> map reverse $ accumulate_n (\i r->r:i) [] [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
[[1,4,7,10],[2,5,8,11],[3,6,9,12]]

Ruby

irb> r=[];[1,2,3].zip([4,5,6],[7,8,9],[10,11,12]) {|v| r << v};r
=> [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
irb> r=[];[1,2,3].zip([4,5,6],[7,8,9],[10,11,12]) {|v| r << v.inject(0){|i,e|i+e}};r
=> [22, 26, 30]