HaskellのlogictをScalaに移植してみた
Haskell に logict というライブラリがあります。
logict: A backtracking logic-programming monad. | Hackage
MonadLogicやLogicTが何者なのかはそのうち解説記事を書くとして、今回はこのライブラリをScalaに移植してみました。
pocketberserker/scala-logic · GitHub
そのうちファーストリリースを出す予定です。
このライブラリを作ったのは、smallcheckをscalaで実装してみたいと思ってコードをみたらLogicTが必要だとわかったためです。
Haskellのlogictとの違い
若干ですが差異があります。
- 型パラメータの順序
- 引数の順序
- logic関数は未実装(RankNTypesに阻まれた)
- いくつか制約を緩めている
制約を緩めているというのは、例えばMonadPlusではなくApplicativePlusでよい、とかですね。
これに関しては私もpull requestをもらうまで気がついていなかったのですが、確かに緩められるものは緩めてもよいですね。
functional dependenciesについて
LogicTのMonadReaderインスタンス実装は@xuwei_kさん、@halcat0x15aさん、@gakuzzzzさんに手伝ってもらいました、ありがとうございます*1。
functional dependenciesをScalaで実現できるのか自体知らなかったので、とても助かりました。 みなさんScalaの函数型なことでわからないことがあったら以下のgitter部屋に突撃するといいと思います。
なぜScalaz?
某猫やkitsの利用も考えたのですが、まだリリースされていなかったり今回の実装に必要そうな機能がなかったりしたので見送りました。 あとはまぁ、Scalazを長らく触っていなかったのでリハビリしたかったとか(某本もでることですし)。
Scalazは長い間開発が続いているだけあって機能が充実していて良いですね。 そういう意味では当分使われ続けるのではないでしょうか。
まとめ
小さいライブラリですがscalazの機能を色々と使っているので、ちょっとした勉強にはなるかもしれません。
*1:よく考えたら全員去年のScalaz勉強会の発表者だ