请看代码。 我相信使用幻像类型使得模式匹配无可辩驳,因此不需要
MonadFail
实例。
{-# 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
但我收到此错误:
• Could not deduce (MonadFail m)
arising from a do statement
with the failable pattern ‘(TI v)’
这种方法有什么问题吗?
我用 ghc 9.0.2 和 8.10.4 检查了这一点。
顺便说一句,即使存在
let
选项,在 -Wincomplete-uni-patterns
中匹配它也不会产生任何警告。
你的做法没有任何问题;它应该按照您的预期工作。这是 GHC 中的一个已知错误,但目前还没有:MonadFail 穷举检查不考虑类型信息 (#25085)
在他们修复之前,您可以通过写
~(TI v) <- return ti
而不是 (TI v) <- return ti
来解决这个问题。