2011-09-20 20 views
6

TemplateHaskell तरह से एक प्रकार का नाम पाने के लिए के रूप में दस्तावेजों दो उद्धरण ('') के हवाले से:खाका हास्केल प्रकार के हवाले से समस्याओं

> ''String 
GHC.Base.String 

यह इस प्रकार के (नाम) के लिए ठीक काम करता है। हालांकि, मुझे इसे अच्छा काम करने के लिए कोई रास्ता नहीं मिल रहा है उदा। Maybe String:

> ''Maybe String -- interprets String as a data constructor 
> ''Maybe ''String -- wants to apply ''String to the Name type 

मैं जानता हूँ कि मैं [t| Maybe String |] का उपयोग कर के माध्यम से वैकल्पिक हल कर सकते हैं, लेकिन यह क्यू इकाई में तो है, और परिवर्तन टाइप आवश्यकता है, और मुझे लगता है कि संबंधित पल में टाइप-चेक नहीं किया गया, केवल जब में spliced।

मैं पहले एक प्रकार के उपनाम, type MaybeString = Maybe String को परिभाषित करके और फिर ''MaybeString का उपयोग करके चारों ओर काम कर सकता हूं, लेकिन यह भी बोझिल है।

सीधे '' उद्धरण के माध्यम से जो कुछ मैं चाहता हूं उसे सीधे प्राप्त करने का कोई तरीका?

उत्तर

6

''नाम नाम देने के लिए उपयोग नहीं किया जाता है, प्रकार नहीं। Maybe एक नाम है, Maybe String नहीं है। इसलिए यह आश्चर्य की बात नहीं है कि आप उस नाम को उद्धृत करने से पहले, एक प्रकार के उपनाम को परिभाषित करके अपना प्रकार का नाम देना होगा।

[t| |] दूसरी ओर, प्रकार उद्धरण उद्धरण। यहां अंतर देखें।

Prelude> :t ''String 
''String :: Language.Haskell.TH.Syntax.Name 
Prelude> :t [t| String |] 
[t| String |] 
    :: Language.Haskell.TH.Syntax.Q Language.Haskell.TH.Syntax.Type 

तो मुझे डर है कि तुम तुम क्या करने की कोशिश कर रहे क्या '' का उपयोग नहीं कर सकते हैं।

+0

धन्यवाद, तो मुझे लगता है मैं या तो quasiquoting का उपयोग करें या के रूप में जोड़ने की जरूरत नहीं करने के लिए [टी एक और समाधान खोजने के लिए लगता है | |] हर जगह ... – iustin

4

मुझे लगता है कि आप के लिए देख रहे हैं:

ConT ''Maybe `AppT` ConT ''String 
+0

दरअसल, यह काम करता है, लेकिन यह इस तरह के निर्माण को लिखने के लिए (अन्य लोगों) को अनुमति देने के लिए एक आसान तरीका खोजने का प्रयास करने के अपने उद्देश्य से पार हो गया है। किसी भी मामले में धन्यवाद! – iustin

+0

हमारे पास यसोड के कुछ स्थानों पर यह समस्या है। मुझे लगता है कि जिसके परिणामस्वरूप मैं आया था वह केवल एक स्ट्रिंग को पार्स कर रहा था, जो कि काफी समय से हमारे काफी अच्छे काम करता है। __Edit__ मैं आपके उपयोग के मामले के लिए अनुमान लगा रहा हूं [टी | ... |] शायद वैसे भी बेहतर होगा, कभी भी ध्यान न दें। –

+0

हाँ, मैंने स्ट्रिंग को पार्स करने के बारे में सोचा था (उदाहरण के लिए, मैं लगातार डेटाबेस को कैसे घोषित करता हूं)। हालांकि, यह मेरे मामले में वैसे भी ज्यादा मदद नहीं करेगा। शायद मुझे बाद में एक बेहतर समाधान मिलेगा, क्योंकि अब मैं [टी | ... |] के साथ प्रबंधन कर सकता हूं :) – iustin

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