久々に入門Haskellのsamegameを作る章を読んだ。本を買った当時は頭に入ってこなくて流し読みしかしなかった記憶があるけど、今読むと書いてあることはシンプルだった。
この本に問題があるわけではなく10年前の本なので当たり前だけど、なんだかなあと思うところが多々ある。
- なんでもかんでも
map
と filter
と zip
と foldr
で済ませようとする
- なんでもかんでも 1 行で書こうとする
where
が大好き *1
- トップレベルの識別子にも型定義してない
- 2016年ではWin上で HGL はビルドできなかった・・・
この関数とか。
filterBoard :: (Pt -> a -> Bool) -> [[a]] -> [[a]]
filterBoard f board = filter ((/=0).length) $ zipWith (\x column -> concat $ zipWith (\y v -> if f (x, y) v then [v] else []) [0..] column) [0..] board
zip
と filter
で押し通すにしても、無理せずこれくらいに分けて書いていいんじゃないって思うわけ。
import Data.List (zip3)
filterBoard f board =
let numbered = zipWith (\x column -> zip3 (repeat x) [0..] column) [0..] board
filtered = map (map trd . filter f') numbered
in filter ((/= 0) . length) filtered
where
f' (x, y, column) = f (x, y) column
trd (_, _, x) = x