2010-01-16 16 views
15

La corrispondenza del motivo è una delle caratteristiche Haskell più eleganti.Seq di corrispondenza del modello in Haskell

Recentemente ho lavorato a un progetto in cui ho bisogno di una struttura dati di coda, quindi sto utilizzando Data.Sequence. Tuttavia, sembra che devo rinunciare all'eleganza di pattern matching e ricorrere a guardie:

floodFillWorker :: Image -> RGBAColor -> Double -> PixelQueue -> Image 
floodFillWorker image base tolerance queue 
    | Seq.null queue = image 
    | otherwise  = doSomeWork image 

Posso usare il pattern matching con le sequenze o devo usare le guardie?

risposta

17

ephemient è sulla strada giusta con i modelli vista, ma penso che ci sia un modo per farlo che in realtà è piuttosto bella. Data.Sequence è stato effettivamente scritto con le viste in mente e dovresti utilizzare i tipi ViewL o ViewR per associare il pattern alla struttura dei dati.

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.viewl -> EmptyL) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
+0

Grazie! Posso usarlo anche per il pattern-match per il front e il resto, come farei con un elenco? ad es. floodFillWorker _ _ _ (first: rest) = .... – Bill

+0

Stavo considerando di farlo notare, ma sembrava che OP non volesse davvero decostruire la sequenza qui. Ma se funziona, allora va bene. – ephemient

+0

Siamo spiacenti, la mia domanda iniziale era solo a metà specificata. Grazie per il chiarimento! – Bill

6

view patterns utilizzare anziché protezioni, ma in realtà non è migliore (IMO). Le guardie guardano bene a me ...

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.null -> True) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
Problemi correlati