简体   繁体   中英

Pattern-matching Seq's in Haskell

Pattern matching is one of the most elegant Haskell features.

I've been working on a project recently where I need a queue data structure so I'm using Data.Sequence. However, it looks like I have to give up the elegance of pattern matching and resort to guards:

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

Can I use pattern matching with sequences or do I need to use guards?

ephemient is on the right track with view patterns but I think there's a way to do it which is actually quite nice. Data.Sequence was actually written with views in mind and you should use either the ViewL or ViewR types in order to patternmatch on the data structure.

{-# LANGUAGE ViewPatterns #-}

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

You could use view patterns instead of guards, but actually it isn't any better (IMO). The guards look fine to me...

{-# LANGUAGE ViewPatterns #-}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM