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

问题描述 投票:0回答:1

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

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
中匹配它也不会产生任何警告。

haskell ghc gadt
1个回答
14
投票

你的做法没有任何问题;它应该按照您的预期工作。这是 GHC 中的一个已知错误,但目前还没有:MonadFail 穷举检查不考虑类型信息 (#25085)

在他们修复之前,您可以通过写

~(TI v) <- return ti
而不是
(TI v) <- return ti
来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.