यहाँ परिदृश्य है: मैंने कुछ कोड को एक प्रकार के हस्ताक्षर के साथ लिखा है और जीएचसी की शिकायत कुछ xऔर के लिए x ~ y नहीं घटा सकती है y। आप आमतौर पर जीएचसी को एक हड्डी फेंक सकते हैं और बस समारोह में बाधा के लिए आइसोमोर्फिज्म जोड़ सकते हैं, लेकिन यह कई कारणों से एक बुरा विचार है:
- यह कोड को समझने पर जोर नहीं देता है।
- आप 5 बाधाओं के साथ समाप्त हो सकते हैं जहां किसी ने पर्याप्त किया होगा (उदाहरण के लिए, यदि 5 एक और विशिष्ट बाधा द्वारा निहित हैं)
- यदि आपने कुछ गलत किया है या यदि जीएचसी अनहेल्दी हो रहा है, तो आप संगीन बाधाओं के साथ समाप्त हो सकते हैं
मैंने केस से जूझते हुए कई घंटे बिताए। मैं साथ खेल रहा हूं syntactic-2.0, और मैं एक डोमेन-स्वतंत्र संस्करण को परिभाषित करने की कोशिश कर रहा था, जिसमें परिभाषित संस्करण के shareसमान है NanoFeldspar.hs।
मेरे पास यह था:
{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic
-- Based on NanoFeldspar.hs
data Let a where
Let :: Let (a :-> (a -> b) :-> Full b)
share :: (Let :<: sup,
Domain a ~ sup,
Domain b ~ sup,
SyntacticN (a -> (a -> b) -> b) fi)
=> a -> (a -> b) -> a
share = sugarSym Let
और जीएचसी could not deduce (Internal a) ~ (Internal b), जो निश्चित रूप से वह नहीं है जिसके लिए मैं जा रहा था। इसलिए या तो मैंने कुछ कोड लिखे थे, जिनका इरादा नहीं था (जो कि बाधा की आवश्यकता थी), या जीएचसी चाहता था कि कुछ अन्य बाधाओं के कारण जो मैंने लिखा था।
यह पता चला है कि मुझे (Syntactic a, Syntactic b, Syntactic (a->b))बाधा सूची में जोड़ने की जरूरत है , जिनमें से कोई भी इसका मतलब नहीं है (Internal a) ~ (Internal b)। मैंने मूल रूप से सही बाधाओं पर ठोकर खाई; मेरे पास अभी भी उन्हें खोजने का एक व्यवस्थित तरीका नहीं है।
मेरे प्रश्न हैं:
- जीएचसी ने उस बाधा का प्रस्ताव क्यों दिया? कहीं भी सिंटैक्टिक में अड़चन नहीं है
Internal a ~ Internal b, तो जीएचसी ने इसे कहां से खींचा? - सामान्य तौर पर, क्या तकनीकों का उपयोग एक बाधा की उत्पत्ति का पता लगाने के लिए किया जा सकता है जो जीएचसी का मानना है कि इसकी आवश्यकता है? बाधाओं के लिए यहां तक कि मैं कर सकते हैं अपने आप को पता चलता है, मेरे दृष्टिकोण अनिवार्य रूप से शारीरिक रूप से पुनरावर्ती बाधाओं नीचे लिख कर हमलावर पथ के लिए मजबूर जानवर है। यह दृष्टिकोण मूल रूप से बाधाओं के एक अनंत खरगोश छेद के नीचे जा रहा है और सबसे कम कुशल विधि के बारे में है जिसकी मैं कल्पना कर सकता हूं।
aऔर bबाध्य हैं - अपने संदर्भ के बाहर के प्रकार के हस्ताक्षर को देखें - a -> (a -> b) -> aनहीं a -> (a -> b) -> b। शायद यही है? बाधा सॉल्वरों के साथ, वे कहीं भी सकर्मक समानता को प्रभावित कर सकते हैं , लेकिन त्रुटियां आमतौर पर एक स्थान "करीब" दिखाती हैं जहां कसना प्रेरित किया गया था। यह अच्छा होगा हालांकि @jozefg - शायद टैग या कुछ के साथ बाधाओं की घोषणा करते हुए, यह दिखाने के लिए कि वे कहाँ से आए हैं? : s