読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

入門Haskell(10年前の本)

haskell

久々に入門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 .. 派なものですみません・・・