GHC doesn't catch missing MonadFail constraint with -XApplicativeDo
-- Bug.hs module Main where import Data.Functor.Identity f :: Identity () -> Identity [Int] -> Identity Int f i0 i1 = do _ <- i0 [x] <- i1 pure (x + 42) main :: IO () main = print $ f (Identity ()) (Identity )
-XApplicativeDo, GHC compiles this program without error or warning. But the resulting program fails at runtime:
$ ghc-8.8.1 -XApplicativeDo --make Bug.hs [1 of 1] Compiling Main ( Bug.hs, Bug.o ) Linking Bug ... $ ./Bug Bug: Bug.hs:(6,11)-(9,15): Non-exhaustive patterns in lambda
Only when the
-XApplicativeDo option is removed does GHC catch the missing constraint:
$ ghc-8.8.1 --make Bug.hs [1 of 1] Compiling Main ( Bug.hs, Bug.o ) [flags changed] Bug.hs:8:3: error: • No instance for (MonadFail Identity) arising from a do statement with the failable pattern ‘[x]’ • In a stmt of a 'do' block: [x] <- i1 In the expression: do _ <- i0 [x] <- i1 pure (x + 42) In an equation for ‘f’: f i0 i1 = do _ <- i0 [x] <- i1 pure (x + 42) | 8 | [x] <- i1 | ^^^^^^^^^
A variation of the problematic program had been reported in #15344 (closed).