Соответствие шаблону Seq в Haskell - PullRequest
15 голосов
/ 16 января 2010

Сопоставление с образцом - одна из самых элегантных функций Haskell.

Недавно я работал над проектом, в котором мне нужна структура данных очереди, поэтому я использую Data.Sequence. Тем не менее, похоже, я должен отказаться от элегантности сопоставления с образцом и прибегнуть к охране:

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

Могу ли я использовать сопоставление с образцом с последовательностями или мне нужно использовать охрану?

Ответы [ 2 ]

17 голосов
/ 16 января 2010

ephemient находится на правильном пути с шаблонами представления, но я думаю, что есть способ сделать это, который на самом деле довольно приятен. Data.Sequence был фактически написан с учетом представлений, и вы должны использовать типы ViewL или ViewR для сопоставления с образцом в структуре данных.

{-# LANGUAGE ViewPatterns #-}

floodFillWorker image _ _ (Seq.viewl -> EmptyL) = image
floodFillWorker image base tolerance queue = doSomeWork image
6 голосов
/ 16 января 2010

Вы могли бы использовать схемы просмотра вместо охранников, но на самом деле это не лучше (ИМО). Охранники выглядят хорошо для меня ...

{-# LANGUAGE ViewPatterns #-}

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