Twitter でいただいたアドバイスを元に、maxLineProd をワンライナーで書き換えてみた。
-- 横一列の連続する4つの数字の積の最大値を取得
maxLineProd :: Integer
maxLineProd = maximum $ map (\line -> (maximum . map product . (!! 4) . transpose . map inits . tails) line) grid
こんな形。
map (\line -> f line) grid
は line 変数を使用せずに
map f grid
と書けるので
maxLineProd = maximum $ map (maximum . map product . (!! 4) . transpose . map inits . tails) grid
さらに各行の maximum のリストを作ってからそのリストの maximum を取って最終的な値を求めているところを
bind(逆bind?)に書き換えて
maxLineProd = maximum $ map product . (!! 4) . transpose . map inits . tails =<< grid
こうなった。
うーむ…確かに正しく動くが処理内容を理解できなかったので細かく解読していこう。