Согласование шаблонов Seq в Haskell

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

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

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

Можно ли использовать сопоставление с последовательностями или мне нужно использовать защитные устройства?

Ответы

Ответ 1

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

{-# LANGUAGE ViewPatterns #-}

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

Ответ 2

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

{-# LANGUAGE ViewPatterns #-}

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