2010-01-16 7 views
15

L'appariement de motifs est l'une des caractéristiques Haskell les plus élégantes.Séquences de correspondance de motifs dans Haskell

J'ai récemment travaillé sur un projet où j'ai besoin d'une structure de données de file d'attente, donc j'utilise Data.Sequence. Cependant, il semble que je dois renoncer à l'élégance de correspondance de motif et le recours aux gardes:

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

Puis-je utiliser pattern matching avec des séquences ou dois-je utiliser des gardes?

Répondre

17

ephemient est sur la bonne voie avec des motifs de vue, mais je pense qu'il ya une façon de le faire qui est en fait tout à fait agréable. Data.Sequence a été réellement écrit avec des vues à l'esprit et vous devriez utiliser les types ViewL ou ViewR afin de patternmatch sur la structure de données.

{-# LANGUAGE ViewPatterns #-} 

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

Merci! Est-ce que je peux aussi l'utiliser pour maquetter le devant et le reste, comme je le ferais avec une liste? par exemple. floodFillWorker _ _ _ (premier: reste) = .... – Bill

+0

Je réfléchissais à cela, mais il semblait que OP ne voulait pas vraiment déconstruire la séquence ici. Mais si cela fonctionne, alors c'est bien. – ephemient

+0

Désolé, ma question d'origine n'était qu'à moitié spécifiée. Merci de clarifier! – Bill

6

Vous pouvez utiliser view patterns au lieu de gardes, mais en fait ce n'est pas mieux (IMO). Les gardes ont l'air bien me ...

{-# LANGUAGE ViewPatterns #-} 

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