125: RenUtil における MonadFail の扱い

↑up

概要

-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 インスタンスにするか(やり方がわかんなかった)すべきと思われる。