先月、 ghc-7.6.x 系でビルドしていたアプリ を ghc-7.10.x でビルドできるようにしたので、忘れないうちに何をやったかメモっておく。
Typeableのdriving
Typeable が PolyKinds でいい感じになったり手でインスタンス作るの禁じられたりしたので自動で導出できるように手直し。
Type role の追加
GADTs とか使ってると type role が nominal に推論されることがあるのだけど、デフォルトだと data の role は representational なので特に *.hs-boot ファイルを作った時にギャップが生じる。ので、明示。
functional dependencies のバグ修正の影響
ghcのバージョンが上がるとバグ修正されることがあって、いいことなんだけど、それによってバグをうまく突いてビルドできていたコードが通らなくなることがある。
ということで、functional dependenc[iesとinstanceに矛盾があった部分が落ちるようになったので修正。
Functor-Applicative-Monad Proposal
これはghc-7.10.x向けの有名なやつ。 Monad が Functor と Applicative 継承するようになったので、 instance 定義をサボってたやつは定義する必要ある。パフォーマンス考えないのであれば自明な定義をするだけでO.K.。
Prelude に Foldable 入った
これも ghc-7.10.x 向け。 Prelude のリスト向けの関数とかが Foldable で定義されるようになったので型が非決定的になる部分が出てきたのを明示。
hashtablesへの移行
Data.Hashtable が deprecated になったので、 https://hackage.haskell.org/package/hashtables へ移行。実体が type になったりしたので ghc に言われるままに equality constraints を追加したり。
stackへの対応
今時だと stack に対応しておいた方が喜ばれる。特に複数パッケージにまたがってビルドしなきゃいけない実行ファイルのリポジトリとか。