2010-01-16 13 views
15

पैटर्न मिलान सबसे सुरुचिपूर्ण हास्केल सुविधाओं में से एक है।हास्केल में पैटर्न-मिलान सेक

मैं हाल ही में एक परियोजना पर काम कर रहा हूं जहां मुझे कतार डेटा संरचना की आवश्यकता है, इसलिए मैं डेटा.Sequence का उपयोग कर रहा हूं।

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

मैं पैटर्न दृश्यों के साथ मिलान का उपयोग करें या मैं गार्ड उपयोग करने की आवश्यकता कर सकते हैं: हालांकि, यह की तरह मैं पैटर्न मिलान की शान छोड़ देना और गार्ड का सहारा लेना है लग रहा है?

उत्तर

17

ephemient दृश्य पैटर्न के साथ सही रास्ते पर है, लेकिन मुझे लगता है कि यह करने के लिए एक तरह से जो वास्तव में काफी अच्छा है। Data.Sequence वास्तव में दिमाग में विचारों के साथ लिखा गया था और आपको डेटा संरचना पर पैटर्नमैच करने के लिए ViewL या ViewR प्रकारों का उपयोग करना चाहिए।

{-# LANGUAGE ViewPatterns #-} 

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

धन्यवाद! क्या मैं इसे आगे और बाकी के लिए पैटर्न-मिलान के लिए भी उपयोग कर सकता हूं, जैसा कि मैं एक सूची के साथ करता हूं? उदा। floodFillWorker _ _ _ (पहला: बाकी) = .... – Bill

+0

मैं इसे इंगित करने पर विचार कर रहा था, लेकिन ऐसा लगता था कि ओपी वास्तव में यहां अनुक्रम को रद्द नहीं करना चाहता था। लेकिन अगर यह काम करता है, तो यह अच्छा है। – ephemient

+0

क्षमा करें, मेरा मूल प्रश्न केवल आधा निर्दिष्ट था। स्पष्टीकरण देने के लिए धन्यवाद! – Bill

6

गार्ड के बजाए view patterns का उपयोग कर सकता है, लेकिन असल में यह कोई बेहतर नहीं है (आईएमओ)। गार्ड मेरे लिए ठीक लग ...

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.null -> True) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
संबंधित मुद्दे