Haskellの数独ソルバーをOCamlで写経してみた

動機は、慶応SFCで数独の問題が出たという記事をみて、かっこいい数独ソルバーの実装はないかな〜とgoogleさんで調べたら、
Haskell sudoku solver in 707 bytesという超かっこいいソースがあったのでまたパクってみました。
作者さんありがとう。イタリア人っぽいのでグラッチェgrazie。

ソースはここ。
https://bitbucket.org/toku/experiment/src/d82f5d9b47c2/sudoku/sudoku.ml

感想

  • Haskellすげー。ゴルフの結果だと思うけど記述量がハンパなく少ない。
  • OCamlで[1..9]ってどう書けばいいんだろう。F#なら[1..9]でいけるのに。
  • for i=1 to do 9ってやって最後List.revしてるところはどうにかならないかな。
  • markの部分の理解に3日かかった。
type T = (Int,Int) -> [Int]

mark :: ((Int,Int),Int) -> T -> T
mark (p@(i,j),n) s q@(x,y) =

これ、型注釈は引数2つなのに、実際には3つあるのが意味不明だった。
最終的にはTが(int, int)をとる関数だとわかり、mark自体が「関数の部分適用」をした状態ということがわかった。
なるほどこれがカリー化ってやつなのかと理解できた。そしてこれは、俺には思いつかないなーってのも思った。

  • あと、Haskellの遅延評価前提のコードを無理やりOCamlにするのは、しないでもいい計算を何度もしてるような気がするので遅くなるんだと思う。メモ化するのがいいのかな。時間測るとちょっと遅くなってる。