# 125: RenUtil における MonadFail の扱い [↑up](bunny_notes) - issued: 2021-12-04 - 分類: 分類:C 改善項目 - status: Open ## 概要 ${-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](https://kakkun61.hatenablog.com/entry/2020/09/02/%E4%B8%80%E7%95%AA%E7%B0%A1%E5%8D%98%E3%81%AA_MonadFail_%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9) のようなもので受けるか、
State モナドを MonadFail インスタンスにするか(やり方がわかんなかった)すべきと思われる。