Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

入門Haskell(10年前の本)

久々に入門Haskellのsamegameを作る章を読んだ。本を買った当時は頭に入ってこなくて流し読みしかしなかった記憶があるけど、今読むと書いてあることはシンプルだった。

この本に問題があるわけではなく10年前の本なので当たり前だけど、なんだかなあと思うところが多々ある。

  • なんでもかんでも mapfilterzipfoldr で済ませようとする
  • なんでもかんでも 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

zipfilter で押し通すにしても、無理せずこれくらいに分けて書いていいんじゃないって思うわけ。

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

*1:let .. in .. 派なものですみません・・・