9

Ich verwende Data.Sequence stattdessen Listen für eine bessere Leistung. Mit Listen können wir die folgendePattern Matching Data.Sequence wie Listen

foo :: [Int] -> Int 
foo [] m = m 
foo (x:xs) m = ... 

tun Wie kann dies mit Data.Sequence erreicht werden. Ich habe folgendes versucht:

foo:: S.Seq Int -> Int 
foo S.empty m = m 
foo (x S.<: xs) m = ... 

Ich denke, die Lösung beinhaltet S.viewl und S.viewr mit, kann aber nicht, herauszufinden, wie sein scheinen.

Antwort

11

ViewPatterns ist wahrscheinlich der Weg, hier zu gehen. Ihr Code funktioniert nicht, weil Sie zuerst viewl oder viewr auf Ihrem Seq aufrufen müssen, um etwas vom Typ ViewL oder ViewR zu erhalten. ViewPatterns kann das ziemlich gut behandeln:

{-# LANGUAGE ViewPatterns #-} 

foo (S.viewl -> S.EmptyL) = ... -- empty on left 
foo (S.viewl -> (x S.:< xs)) = ... -- not empty on left 

die zu so etwas wie gleichwertig ist:

foo seq = case S.viewl seq of 
    S.EmptyL -> ... 
    (x S.:< xs) -> ... 
+1

Meinen Sie S.EmptyL – abden003

15

Ab GHC 7.8 können Sie pattern synonyms zusammen mit view patterns für diesen Zweck verwenden:

{-# LANGUAGE ViewPatterns, PatternSynonyms #-} 

import qualified Data.Sequence as Seq 

pattern Empty <- (Seq.viewl -> Seq.EmptyL) 
pattern x :< xs <- (Seq.viewl -> x Seq.:< xs) 
pattern xs :> x <- (Seq.viewr -> xs Seq.:> x) 

Ab GHC 7.10 können Sie es auch in ein bidirektionales Muster-Synonym machen, so dass Empty, (:<) und (:>) können als „Erbauer“ auch verwendet werden:

{-# LANGUAGE ViewPatterns, PatternSynonyms #-} 

import qualified Data.Sequence as Seq 

pattern Empty <- (Seq.viewl -> Seq.EmptyL) where Empty = Seq.empty 
pattern x :< xs <- (Seq.viewl -> x Seq.:< xs) where (:<) = (Seq.<|) 
pattern xs :> x <- (Seq.viewr -> xs Seq.:> x) where (:>) = (Seq.|>) 
+1

ausgezeichnet, ich hatte keine Ahnung, das es in 7.10 gemacht. Warum ist das [GHC ticket] (https://ghc.haskell.org/trac/ghc/ticket/8581) trotzdem geöffnet? –

+0

@ AndrásKovács: erhmm ... Ich habe es offen gelassen, weil die Kontext-Probleme Matcher vs Builder-Typ in diesem Ticket noch nicht vollständig adressiert wurden. – Cactus