我有一个类,SeqNE代表非空序列:
newtype SeqNE ? = SeqNE { unSeqNE ? NonNull (Seq ?) }
deriving Eq
type instance Element (SeqNE ?) = ?
Run Code Online (Sandbox Code Playgroud)
whereNonNull来自 Michael Snoyman 的mono-traversable包,Sequence来自容器包。
我有一个(unicode)模式来(分解)组合SeqNE实例:
infixl 5 :?
{- | (de)compose a `SeqNE ?` from a `Seq ?` and an `?` (rightwards) -}
pattern (:?) ? Seq ? -> ? -> SeqNE ?
pattern xs :? x <- (unsnoc -> (xs,x))
where xs :? x = xs ||> x
{-# COMPLETE (:?) #-}
Run Code Online (Sandbox Code Playgroud)
哪里unsnoc有类型unsnoc ? SeqNE ? ? (Seq ?, ?)。
如图所示,我已经使用COMPLETE编译指示告诉 GHC 这个模式是完整的。但是,实际上,如果我在视图模式中使用这样的模式匹配(例如foo,下面);然后我得到了一个“模式匹配不是详尽的”警告;而,如果我使用我认为在道德上相同的代码,但在明确的 case 语句中(例如bar,下面),则警告将被忽略(我已经测试了删除COMPLETE编译指示,并且正如预期的那样,然后我收到警告bar还)。
foo ? NonEmpty.NonEmpty ? ? Seq ?
foo (fromNonEmpty ? xs :? _) = xs
bar ? NonEmpty.NonEmpty ? ? Seq ?
bar ss = case fromNonEmpty ss of
xs :? _ ? xs
Run Code Online (Sandbox Code Playgroud)
我在这里发现了一个类似的问题,但答案COMPLETE是对类型 /classes/ 无效;我没有在这里使用类型类。
所以我认为这可能是合法的。GHC 错误,COMPLETE编译指示。vs. 视图模式 - 但我想要第二(和第三)意见,因为我往往比 GHC 更经常出错......
谢谢,