2010-01-16 24 views
15

La coincidencia de patrones es una de las características más elegantes de Haskell.Seq de coincidencia de patrones en Haskell

He estado trabajando recientemente en un proyecto en el que necesito una estructura de datos en cola, así que estoy usando Data.Sequence. Sin embargo, parece que tengo que renunciar a la elegancia de coincidencia de patrones y el recurso a los guardias:

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

¿Puedo usar la coincidencia de patrones con secuencias o tengo que utilizar guardias?

Respuesta

17

ephemient está en el camino correcto con patrones de vista, pero creo que hay una manera de hacerlo que en realidad es bastante agradable. Data.Sequence se escribió con las vistas en mente y debe usar los tipos ViewL o ViewR para hacer una coincidencia de patrones en la estructura de datos.

{-# LANGUAGE ViewPatterns #-} 

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

Gracias! ¿Puedo usarlo también para emparejar patrones para el frente y el resto, como lo haría con una lista? p. floodFillWorker _ _ _ (first: rest) = .... – Bill

+0

Estaba considerando señalar esto, pero al parecer OP no quería deconstruir la secuencia aquí. Pero si eso funciona, entonces esto es bueno. – ephemient

+0

Lo siento, mi pregunta original solo estaba medio especificada. ¡Gracias por aclararlo! – Bill

6

Usted podría usar view patterns en lugar de guardias, pero en realidad no es mejor (IMO). Los guardias se ven muy bien a mí ...

{-# LANGUAGE ViewPatterns #-} 

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