Scala 3のmatch typeで数独solverを作った

昨日の続き

xuwei-k.hatenablog.com

昨日のcheckするだけのものは数秒で終わるのですが、これは手元で

compileに2分くらい

かかります。 速度に関して改善の余地があるのかどうか?はわかりません。

改善したら、問題が簡単なら数秒で終わるようになりました。

いくつかtweetしましたが、compilerの限界なのでは?と思ったけれど、頑張った結果、いくつかは自分のミスでした。例えば

  • 割り算するべき箇所で余りを取っていた
  • scala.compiletime.ops.any.== は、singleton同士ではないと比較不可能。例えば (1, 2)(3, 4) といったTupleのまま比較不可能なので、自前でsingletonになるまで必要に応じて再帰的に分解しつつdeepなequalsを実装する必要がある(つらい)
  • 複雑になり過ぎると、上記のようなミスをした場合に、単に無限にcompile時間がかかるか、謎に変な場所でエラーになるだけに見えて、エラーの原因が超分かりにくい
    • 途中にdebug logとか入れられないし

といった感じです。自分にとっては、やっと面白い難易度になってきた、という感じですね(?)

ただ、アルゴリズムはすごく単純なものなので、簡単な問題しか解けないです。

また、昨日以上に細かい部分が雑ですが、とにかく完成した現状を貼り付けておきます。 (後でリファクタするかどうか?未定)

gist.github.com