Please look at the code. I believe using phantom type makes the pattern matching irrefutable so there is no need in MonadFail instance.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -Wincomplete-uni-patterns #-}
data Type = I | S
data T t where
TI :: Int -> T 'I
TS :: String -> T 'S
ti :: T 'I
ti = TI 42
test :: Monad m => m Int
test = do
(TI v) <- return ti
return v
But I am getting this error:
• Could not deduce (MonadFail m)
arising from a do statement
with the failable pattern ‘(TI v)’
What's wrong with this approach?
I checked this with ghc 9.0.2 and 8.10.4.
By the way, matching it in let does not produce any warning even in the presence of -Wincomplete-uni-patterns option.
There's nothing wrong with your approach; it should work as you expect it to. It's a known bug in GHC that it currently doesn't: MonadFail exhaustivity checking does not take into account type information (#25085)
Until they fix it, you can work around it by writing ~(TI v) <- return ti instead of (TI v) <- return ti.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With