请看代码。我相信使用幻像类型使得模式匹配无可辩驳,因此实例中不需要MonadFail。
{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE GADTs #-}\n\n{-# OPTIONS_GHC -Wall #-}\n{-# OPTIONS_GHC -Wincomplete-uni-patterns #-}\n\ndata Type = I | S\n\ndata T t where\n TI :: Int -> T 'I\n TS :: String -> T 'S\n\nti :: T 'I\nti = TI 42\n\ntest :: Monad m => m Int \ntest = do\n (TI v) <- return ti\n return v\nRun Code Online (Sandbox Code Playgroud)\n但我收到此错误:
\n \xe2\x80\xa2 Could not deduce (MonadFail m)\n arising from a do statement\n with the failable pattern \xe2\x80\x98(TI v)\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n这种方法有什么问题吗?
\n我用 ghc 9.0.2 和 8.10.4 检查了这一点。
\n顺便说一句,let即使存在-Wincomplete-uni-patterns选项,将其匹配也不会产生任何警告。
Jos*_*ica 14
你的方法没有任何问题;它应该按照您的预期工作。这是 GHC 中的一个已知错误,但目前还没有:在使用 MonadFailDesugaring 时考虑详尽性检查 (#15681)(评论)
~(TI v) <- return ti在他们修复它之前,您可以通过编写而不是 来解决它(TI v) <- return ti。