Согласование шаблонов 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