幻像类型使模式匹配无可辩驳,但这似乎在 do 表示法中不起作用

ama*_*rov 14 haskell ghc gadt

请看代码。我相信使用幻像类型使得模式匹配无可辩驳,因此实例中不需要MonadFail

\n
{-# 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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

这种方法有什么问题吗?

\n

我用 ghc 9.0.2 和 8.10.4 检查了这一点。

\n

顺便说一句,let即使存在-Wincomplete-uni-patterns选项,将其匹配也不会产生任何警告。

\n

Jos*_*ica 14

你的方法没有任何问题;它应该按照您的预期工作。这是 GHC 中的一个已知错误,但目前还没有:在使用 MonadFailDesugaring 时考虑详尽性检查 (#15681)(评论)

~(TI v) <- return ti在他们修复它之前,您可以通过编写而不是 来解决它(TI v) <- return ti