-XNoMonadFailDesugaring が廃止されてしまって、Monad インスタンスから fail メソッドがなくなってしまったことに伴い、Typing.mgu などは MonadFail インスタンスにした。
一方、Rename で用いられる TC は Control.Monad.State.Strict をそのまま使っており、 Monad インスタンスではあるが MonadFail ではない。
そのため、現状では mgu の結果をいったん Maybe で受けて、Nothing だった場合には error するようにしているが、これでは fail に含まれていた情報が欠落してしまう:
unify' :: Type -> Type -> TC () unify' t1 t2 = do s <- getSubst let u = case mgu (apply s t1) (apply s t2) of Just x -> x Nothing -> error "unify' failed" extSubst u
これは、Maybe ではなく Result のようなもので受けるか、 State モナドを MonadFail インスタンスにするか(やり方がわかんなかった)すべきと思われる。