haskell 为什么使用PatternSynonyms会触发非穷举匹配警告?

3zwjbxry  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(99)

我学习this answer是为了学习如何在Sequence上进行模式匹配。具体来说,假设我在二维网格上使用Sequence作为队列来实现breadth-first search。仅使用ViewPatterns,我可能会得到如下所示的结果:

{-# LANGUAGE ViewPatterns #-}

import qualified Data.Sequence as Seq
import qualified Data.Set as Set

bfs :: Seq.Seq ((Int, Int), Int) -> Set.Set (Int, Int) -> Int
bfs (Seq.viewr -> Seq.EmptyR) _ = -1 -- goal not found
bfs (Seq.viewr -> (coords Seq.:> (coord@(r, c), dist))) seen = -- search plumbing...

根据@Cactus的回答,如果我也想使用PatternSynonyms,我会得出:

{-# LANGUAGE PatternSynonyms #-}

...

pattern Empty :: Seq.Seq a
pattern Empty <- (Seq.viewr -> Seq.EmptyR)

pattern (:>) :: Seq.Seq a -> a -> Seq.Seq a
pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)

bfsPat :: Seq.Seq ((Int, Int), Int) -> Set.Set (Int, Int) -> Int
bfsPat Empty _ = -1
bfsPat (coords :> (coord@(r, c), dist)) seen = ...

在我看来,这两种方法是等价的,但编译器不同意:

In an equation for ‘bfsPat’:
        Patterns not matched:
            (Data.Sequence.Internal.Seq Data.Sequence.Internal.EmptyT)
            (Data.Set.Internal.Bin _ _ _ _)
            (Data.Sequence.Internal.Seq Data.Sequence.Internal.EmptyT)
            Data.Set.Internal.Tip
            (Data.Sequence.Internal.Seq (Data.Sequence.Internal.Single _))
            (Data.Set.Internal.Bin _ _ _ _)
            (Data.Sequence.Internal.Seq (Data.Sequence.Internal.Single _))
            Data.Set.Internal.Tip
            ...

我错过了什么,打破了这两个公式之间的等效性,我如何才能修复它?

mspsb9vt

mspsb9vt1#

请看the wiki page on COMPLETE pragmas。我将引用开头的内容:“穷举检查器当前会阻塞模式同义词。它们被标记为总是会出错的模式,这意味着我们还必须始终包括一个包罗万象的情况,以避免出现警告。”
简而言之,您需要提供COMPLETE pragma,例如:

{-# COMPLETE Empty, (:>) #-}

相关问题