我学习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
...
我错过了什么,打破了这两个公式之间的等效性,我如何才能修复它?
1条答案
按热度按时间mspsb9vt1#
请看the wiki page on COMPLETE pragmas。我将引用开头的内容:“穷举检查器当前会阻塞模式同义词。它们被标记为总是会出错的模式,这意味着我们还必须始终包括一个包罗万象的情况,以避免出现警告。”
简而言之,您需要提供COMPLETE pragma,例如: