我正在跟进这个答案 https://stackoverflow.com/a/31106916/12162258学习如何进行模式匹配Sequence https://hackage.haskell.org/package/containers-0.6.6/docs/Data-Sequence.htmls。为了具体起见,想象一下我正在实施广度优先搜索 https://en.wikipedia.org/wiki/Breadth-first_search在二维网格上使用Sequence
作为队列。仅使用ViewPatterns https://ghc.haskell.org/trac/ghc/wiki/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...
下列的@仙人掌的回答 https://stackoverflow.com/a/31106916/12162258,如果我也想使用PatternSynonyms https://ghc.haskell.org/trac/ghc/wiki/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
...
我错过了什么破坏了这两个公式之间的等价性,我该如何修复它?