मैं एक ऐसा फ़ंक्शन लिख रहा हूं जो कुछ मनमाने ढंग से प्रतीकों के अनुक्रम में खोज करता है। मैं इसे सामान्य जेनेरिक बनाना चाहता हूं ताकि यह सूचियों पर काम करे, Foldable
एस ByteString
एस और Text
एस पर भी काम करता है। इसे Foldable
पर सामान्य बनाना सरल है। लेकिन ByteString
एस और Text
एस कैसे शामिल करें? निश्चित रूप से मैं ByteString
को एक सूची में परिवर्तित कर सकता हूं और फिर मेरे फ़ंक्शन को कॉल कर सकता हूं, लेकिन मैं सभी फायदे ByteString
एस खो दूंगा। ,सूचियों, बाइटस्ट्रिंग्स और ग्रंथों (और शायद अन्य समान प्रतिनिधित्व) पर एक एकल फ़ंक्शन काम करना
import Control.Monad.State
import qualified Data.Foldable as F
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Word
import qualified Data.ByteString as B
import qualified Data.Text as T
type Histogram a = Map a Int
empty :: (Ord a) => Histogram a
empty = Map.empty
histogramStep :: (Ord a) => a -> Histogram a -> Histogram a
histogramStep k = Map.insertWith (+) k 1
histogram :: (Ord a, F.Foldable t) => t a -> Histogram a
histogram = F.foldl (flip histogramStep) empty
लेकिन चूंकि न ByteString
और न ही पाठ Foldable
हो सकता है (यह भंडार सिर्फ Word8
एस/Char
रों, नहीं मनमाना तत्व):
एक ठोस उदाहरण के लिए, हम एक हिस्टोग्राम समारोह बनाना चाहते जाने करवाने के लिए मैं और अधिक कार्यों है कि एक तरह से पहले देखो बिल्कुल बनाने के साथ फंस कर रहा हूँ, बस एक अलग प्रकार हस्ताक्षरों के साथ:
histogramBS :: B.ByteString -> Histogram Word8
histogramBS = B.foldl (flip histogramStep) empty
histogramText :: T.Text -> Histogram Char
histogramText = T.foldl (flip histogramStep) empty
यह कुछ ऐसा है जो हास्केल जैसी कार्यात्मक भाषा में अपेक्षा नहीं करता है।
इसे एक बार और सभी के लिए histogram
लिखने के लिए सामान्य कैसे बनाएं?
क्योंकि आप आप क्या कर रहे हैं गहराई से लगता है कि तुम हमेशा दिलचस्प सवाल पूछने और हमेशा अधिक जानना चाहते हैं। +1 – AndrewC