5

क्या बिल्ली यहाँ पर जा रहा है '` # के खिलाफ':से मेल नहीं कर सके तरह `*

"Couldn't match kind `*' against `#'" 

मैं TemplateHaskell का उपयोग कर GHCi में निम्नलिखित कोशिश कर रहा था (ghci -XTemplateHaskell)

$(reify ''Show >>= dataToExpQ (const Nothing)) 

मैं इस से Exp प्राप्त करने की उम्मीद कर रहा था (जिसमें शो का एक उदाहरण है)। मैं इस एप्लिकेशन में हैकेल प्रकारों के बारे में जानकारी डालने के लिए ऐसा कर रहा हूं जैसे कि यह वास्तविक डेटा के रूप में उपलब्ध है, स्ट्रिंग के रूप में नहीं।

मेरा लक्ष्य निम्नलिखित है:

info :: Info 
info = $(reify ''Show >>= dataToExpQ (const Nothing)) 

मैं वास्तव में जो त्रुटि संदेश समझ में नहीं आता, क्या '#' वैसे भी है? यदि # है, तो # -> # या * -> # भी है? क्या यह ऐसा कुछ है जो प्रकारों से संबंधित प्रकारों से संबंधित है (हालांकि मुझे नहीं पता कि यह क्या हो सकता है)?


ठीक है, तो अब मैं समझ GHC प्रकार के एक पदानुक्रम है और कि `# 'अनबॉक्स्ड प्रकार के एक विशेष प्रकार का है कि है। सब ठीक है और अच्छा है, लेकिन यह त्रुटि क्यों पॉप अप करती है? शायद unboxed प्रकार genercis के साथ अच्छी तरह से खेल नहीं है?

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

आगे की जांच पर मेरा मानना ​​है कि Names समस्या उत्पन्न करती है, क्या डेटा ToExpQ में उन्हें बाधित करने का कोई तरीका है? वैसे भी उस तर्क का उपयोग कैसे करें?

+5

'#' अनबॉक्स किए गए प्रकारों की तरह है, http://stackoverflow.com/a/3034295/700253 – Vitus

+0

संकेत के लिए धन्यवाद देखें। तो: समस्या को हल करने के लिए कैसे :-)? – scravy

उत्तर

4

आप सही हैं, यह नाम है जो समस्या का कारण बनता है। अधिक विशेष रूप से, समस्या यह है कि NameFlavour डेटा प्रकार में इसके कुछ फ़ील्ड में अनबॉक्स किए गए पूर्णांक हैं।

डेटा नामफ्लॉवर उदाहरण पर एक हैडॉक नोट है जो कुछ लाल झंडे उठाता है। और यदि आप स्रोत पर क्लिक करते हैं, तो आप देखेंगे कि gfoldl परिभाषा अनिवार्य रूप से अनगिनत पूर्णांक जैसे पूर्णांक का इलाज करती है। (वास्तव में कोई और विकल्प नहीं है ...) यह अंततः आपके द्वारा देखी जा रही त्रुटि का कारण बनता है क्योंकि डेटा ToExpQ - भ्रामक डेटा नामफ्लोर उदाहरण द्वारा धोखा दिया गया है - एक एक्सप टर्म बनाता है जो नामू को एक (Int :: *) पर लागू करता है जब नामू वास्तव में अपेक्षा करता है एक (अनबॉक्सिंग) (Int # :: #)।

तो समस्या यह है कि NameFlavour के लिए डेटा इंस्टेंस डेटा ToExpQ द्वारा धारित आविष्कार की अवज्ञा करता है। लेकिन चिंता न करें! यह परिदृश्य इस कारण से नीचे आता है कि डेटा ToExpQ एक तर्क लेता है: तर्क हमें परेशान प्रकारों के लिए विशेष उपचार प्रदान करने देता है। नीचे, मैं नामफ्लोरर कन्स्ट्रक्टरों को सही ढंग से सुधारने के लिए ऐसा करता हूं जिनमें अनबॉक्स किए गए पूर्णांक फ़ील्ड हैं।

इसके लिए समाधान हो सकते हैं, लेकिन मुझे उनके बारे में पता नहीं है, इसलिए मैंने निम्नलिखित को ऊपर उठाया। टीएच स्टेजिंग प्रतिबंध के कारण इसे एक अलग मॉड्यूल की आवश्यकता है।

{-# LANGUAGE TemplateHaskell #-} 
{-# LANGUAGE MagicHash #-} 

module Stage0 where 

import Language.Haskell.TH 
import Language.Haskell.TH.Syntax 

import GHC.Types (Int(I#)) 
import GHC.Prim (Int#) 

unboxed :: Int# -> Q Exp 
unboxed i = litE $ intPrimL $ toInteger $ I# i -- TH does support unboxed literals 

nameFlavorToQExp :: NameFlavour -> Maybe (Q Exp) 
nameFlavorToQExp n = case n of 
    NameU i -> Just [| NameU $(unboxed i) |] 
    NameL i -> Just [| NameL $(unboxed i) |] 
    _ -> Nothing 

और फिर मेरे लिए निम्नलिखित संकलन।

{-# LANGUAGE TemplateHaskell #-} 

import Language.Haskell.TH 
import Language.Haskell.TH.Quote 

import Generics.SYB 
import Stage0 

info :: Info 
info = $(reify ''Show >>= dataToExpQ (mkQ Nothing nameFlavorToQExp)) 

चेतावनी प्रोग्रामर अनबॉक्स्ड पूर्णांकों हम यहाँ के लिए पीछे की ओर झुकने से अधिक कर रहे हैं करने के लिए "विशिष्ट आवृत्तियां" अनुरूप कि GHC आंतरिक रूप से उपयोग करता है। उन्हें क्रमशः क्रमबद्ध होने की उम्मीद नहीं है। परिणामस्वरूप जानकारी मूल्य का उपयोग करने के तरीके के आधार पर, इससे विस्फोट हो सकता है।

शो को पुन: संशोधित करते समय भी ध्यान दें, आप शो के हर उदाहरण को भी सुधार रहे हैं जो दायरे में है।

  • उनमें से बहुत सारे हैं - यह एक बहुत बड़ा वाक्यविन्यास शब्द उत्पन्न करता है।

  • the documentation कहता है, इन उदाहरणों में विधि परिभाषाएं शामिल नहीं हैं।

एचटीएच।

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