我正在關注此答案以了解如何在Sequences 上進行模式匹配。具體而言,假設我正在使用 a作為佇列在二維網格上實施廣度優先搜索。Sequence使用 just 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
...
我錯過了什么打破了這兩個公式之間的等價性,我該如何解決?
uj5u.com熱心網友回復:
查看有關 COMPLETE pragmas 的 wiki 頁面。我將參考開頭的話:“詳盡檢查器目前在模式同義詞上窒息。它們被標記為總是容易出錯的模式,這意味著我們還必須始終包含一個包羅萬象的案例以避免警告。”
簡而言之,您需要提供一個完整的編譯指示,例如:
{-# COMPLETE Empty, (:>) #-}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/537793.html
標籤:哈斯克尔模式同义词
上一篇:如何創建HTML模板?
