जब भी मैं एक नई भाषा सीखने पर विचार करता हूं - इस मामले में हैकेल - मैं यह देखने के लिए एक मूल जीपी क्लोन को एक साथ हैक करने की कोशिश करता हूं कि भाषा कार्यान्वयन और/या इसकी पुस्तकालय टेक्स्ट प्रोसेसिंग पर कितनी अच्छी हैं, क्योंकि यह एक प्रमुख उपयोग केस है मुझे।हैकेल में आदिम लेकिन कुशल grep क्लोन?
code on the haskell wiki से प्रेरित होकर, मैं निम्नलिखित अनुभवहीन प्रयास के साथ आया था:
{-# LANGUAGE FlexibleContexts, ExistentialQuantification #-}
import Text.Regex.PCRE
import System.Environment
io :: ([String] -> [String]) -> IO()
io f = interact (unlines . f . lines)
regexBool :: forall r l .
(RegexMaker Regex CompOption ExecOption r,
RegexLike Regex l) =>
r -> l -> Bool
regexBool r l = l =~ r :: Bool
grep :: forall r l .
(RegexMaker Regex CompOption ExecOption r, RegexLike Regex l) =>
r -> [l] -> [l]
grep r = filter (regexBool r)
main :: IO()
main = do
argv <- getArgs
io $ grep $ argv !! 0
यह कर रही है कि क्या मैं इसे करना चाहते हैं प्रकट होता है, लेकिन दुर्भाग्य से, यह वास्तव में धीमी है - के बारे में 10 बार की तुलना में धीमी एक पाइथन लिपि एक ही काम कर रही है। मुझे लगता है कि यह रेगेक्स लाइब्रेरी नहीं है जो यहां गलती है, क्योंकि यह पीसीआरई में कॉल कर रहा है जो बहुत तेज होना चाहिए (Text.Regex.Posix
पर स्विचिंग कुछ और चीजों को धीमा कर देता है)। तो यह String
कार्यान्वयन होना चाहिए, जो सैद्धांतिक दृष्टिकोण से निर्देशक है लेकिन जो मैंने पढ़ा है उसके अनुसार अक्षम है।
दोनों कुशल और सुविधाजनक है कि हास्केल में String
रों के लिए एक विकल्प है (यानी वहाँ कम या कोई घर्षण का उपयोग करते समय कि बजाय String
रों का उपयोग करने जा) और कहा कि पूरी तरह से और सही ढंग से, संभालती है UTF-8 एन्कोड यूनिकोड के साथ-साथ यदि संभव हो तो बिना किसी परेशानी के अन्य एन्कोडिंग के रूप में? कुछ ऐसा है जो हर कोई हैकेल में पाठ प्रसंस्करण करते समय उपयोग करता है लेकिन मुझे बस इतना पता नहीं है क्योंकि मैं एक पूर्ण शुरुआत कर रहा हूं?
[टेक्स्ट] का उपयोग करें (https://hackage.haskell.org/package/text-1.2.2.1/docs/Data-Text.html) – ErikR
बस यह इंगित करना चाहता था कि सी-जैसी गति संभव है, लेकिन यह कुछ प्रयास कर सकता है। __cgrep__ पर एक नज़र डालें - http://awgn.github.io/cgrep/ – ErikR
'स्ट्रिंग' एक कम-प्रदर्शन, आलसी स्ट्रिंग है, जो मूल लघु तारों के लिए" ठीक "है लेकिन गंभीर टेक्स्ट मैनिपुलेशन के लिए अनुपयुक्त है। यूनिकोड टेक्स्ट मैनिपुलेशन के लिए 'टेक्स्ट' उच्च-प्रदर्शन प्रकार है। (वहां 'बाइटस्ट्रिंग' भी है जो पाठ के लिए _not_ है लेकिन बाइट अनुक्रमों के लिए है।) – chi