2012-04-01 7 views
13

के बिना दो डेटा.Texts में शामिल होने का मानक तरीका मुझे लगता है कि Data.Text भविष्य में Haskell संस्करणों में String एस को प्रतिस्थापित करने जा रहा है। मेरे पास एक मुद्दा यह है कि (++) केवल सूचियों के लिए परिभाषित किया गया है। दो Text रों श्रेणीबद्ध करने के लिए, मैं'mappend`

text1 `mappend` text2 

कौन सा जल्दी वर्बोस हो जाता है प्रयोग करना होगा। आदर्श रूप से मैं इन Text एस पर ++ का उपयोग करने में सक्षम होना चाहता हूं, लेकिन यदि नहीं, तो दूसरा विकल्प क्या है? मैं अपना खुद का इंफिक्स ऑपरेटर परिभाषित कर सकता हूं, लेकिन मुझे ऐसा करने का एक मानक तरीका चाहिए।

उत्तर

17

जीएचसी 7.4 से (सुनिश्चित नहीं है कि कौन सा बिंदु संस्करण) एक पूर्वनिर्धारित <> ऑपरेटर है जो mappend जैसा ही काम करता है। तो तुम

text1 <> text2 

ताकि "मानक" इन्फ़िक्स ऑपरेटर का कहना है कि कर सकेंगे, लेकिन यह हर जगह अभी तक उपलब्ध नहीं है।

+1

यह एक खराब नामित ऑपरेटर है। '<>' में "बराबर नहीं" के अर्थशास्त्र हैं। यह सभी मोनोइड्स पर काम करने के लिए '++' को सामान्यीकृत करने के लिए अच्छा होगा। –

+8

<> चुना गया था क्योंकि यह पहले से ही मोनोइडल सेमेन्टिक्स के साथ सुंदर प्रिंटिंग लाइब्रेरीज़ द्वारा उपयोग में था, और इसका कम से कम घुसपैठ करने वाला विकल्प जो मौजूदा कोड को तोड़ता नहीं है, या विषम पूर्वाग्रह है। दूसरी ओर सामान्यीकृत (++), इस तरह से नहीं किया जा सकता है जो प्राथमिकता स्तर के कारण अच्छी सुंदर मुद्रण पुस्तकालयों के लिए बनाता है, और इसका उपयोग हैकेल 98 से पहले एक और अर्थ होता था, जब इसका उपयोग हमारे लिए किया जाता था अब mplus कॉल करें। अगर हम अन्य भाषाओं में अर्थों से चीजों से परहेज करते हैं तो हमारे पास कोई ऑपरेटर नहीं छोड़ेगा! ऑपरेटर <<, >>, -,!,%, आदि। अन्य सभी भाषाओं में अन्य अर्थशास्त्र भी हैं। –

+0

अजीब, मैं इसका उपयोग करने की कोशिश कर रहा हूं लेकिन 'दायरे में नहीं:' <> ''प्राप्त कर रहा हूं। जीएचसी 7.10.3 – klappvisor

1

सभी प्रकार के मोनोइड्स के लिए बस mconcat का उपयोग करें। आपको कुछ भी आयात करने की आवश्यकता नहीं है, और कोड इसके साथ बहुत साफ दिखता है।

उदाहरण:

{-# LANGUAGE OverloadedStrings #-} 

import   Data.Text 

table :: Text 
table = "user" 

fields :: [Text] 
fields = ["id","nickname","password","date","posts","comments"] 

insertquery :: Text -> [Text] -> Text 
insertquery table fields = mconcat 
    ["insert into ",table," (",names,") values (",vals,");"] 
    where 
    names = insertcomma fields 
    vals = insertcomma [singleton '?' | _ <- fields] 
    insertcomma = intercalate (singleton ',') 

और परिणाम यह देता है:

λ> insertquery तालिका क्षेत्रों

"उपयोगकर्ता (आईडी, उपनाम, पासवर्ड, तिथि, पोस्ट, टिप्पणियों में डालने) मान (?,?,?,?,?,?); "

+0

मुझे यकीन नहीं है कि मैं सहमत हूं कि 'mconcat [...] ''>> से बेहतर है, खासकर जब वहां हैं गठबंधन करने के लिए केवल दो या तीन मान। लेकिन यह निश्चित रूप से आपके उदाहरण की तरह बड़े concatenations के लिए विचार करने लायक विकल्प है। – leftaroundabout

संबंधित मुद्दे