sicplite #8 にいってきた
- 遅刻をしました
- 2.43 を考えていた
- accumlate-n が Ruby の Enumerable::zip っぽい
- accumulate-n を勘違いしていた → tree をmap っぽくするものだと
- 普通に map (fold f) . zip でした
- accumulate-n を勘違いしていた → tree をmap っぽくするものだと
- 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]