2010-01-16 18 views
15

Dopasowywanie wzorców jest jedną z najbardziej eleganckich cech Haskella.Dopasowywanie do wzorca Seq w Haskell

Pracowałem ostatnio nad projektem, w którym potrzebuję struktury danych kolejek, więc używam Data.Sequence. Jednak wygląda na to, muszę zrezygnować elegancję dopasowywania wzorców i uciekać się do strażników:

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

mogę używać wzór pasujący sekwencjami czy muszę używać strażników?

Odpowiedz

17

ephemient jest na dobrej drodze z widokiem wzorów ale myślę, że istnieje sposób, aby zrobić to co jest całkiem miłe. Data.Sequence został napisany z myślą o widokach i należy użyć typów ViewL lub ViewR w celu wzorcowania na strukturze danych.

{-# LANGUAGE ViewPatterns #-} 

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

Dzięki! Czy mogę też użyć go do dopasowania wzoru do przodu i do reszty, tak jak z listą? np. floodFillWorker _ _ _ (first: rest) = .... – Bill

+0

Rozważałem wskazanie tego, ale wydawało się, że OP faktycznie nie chce dekonstruować sekwencji tutaj. Ale jeśli to działa, to jest to dobre. – ephemient

+0

Niestety, moje pierwotne pytanie zostało tylko w połowie określone. Dzięki za wytłumaczenie! – Bill

6

Możesz może użyć view patterns zamiast strażników, ale tak naprawdę nie jest lepsza (IMO). Strażnicy wyglądają dobrze mi ...

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.null -> True) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
Powiązane problemy