ठीक करता है इस कोड पर विचार करें:एक अप्रयुक्त उदाहरण जोड़ना एक प्रकार की त्रुटि
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
module Foo where
class Foo a
class SomeClass a
instance {-# OVERLAPPABLE #-} (Foo a) => SomeClass a
bar :: (SomeClass a) => a -> Int
bar = const 0
foo :: (SomeClass a) => a -> Int
foo t = let x = bar t in x
यहाँ, foo
कॉल bar
, और उसके संदर्भ में SomeClass
बाधा का उपयोग कर ऐसा करने के लिए सक्षम होना चाहिए। इसके बजाय, GHC मान लिया गया यह इतना Foo a => SomeClass a
उदाहरण का उपयोग करते हुए कार्य करना होगा:
Foo.hs:16:17:
Could not deduce (Foo a) arising from a use of ‘bar’
from the context (SomeClass a)
bound by the type signature for foo :: SomeClass a => a -> Int
at Foo.hs:15:8-32
Possible fix:
add (Foo a) to the context of
the inferred type of x :: Int
or the type signature for foo :: SomeClass a => a -> Int
In the expression: bar t
In an equation for ‘x’: x = bar t
In the expression: let x = bar t in x
वहाँ दो इसे ठीक करने के तरीके हैं:
foo
में करने के लिए लाइनinstance SomeClass Int
जोड़,bar t
- को
let x = bar t in x
बदलते मेरी कार्यक्रम
यहाँ क्या चल रहा है? यह समस्या क्यों हो रही है, और ये क्यों काम करते हैं?
यह उदाहरण, मेरी वास्तविक समस्या से सरल है। बहु भाषा परिवर्तन (arxiv.org/pdf/1707.04600) के लिए क्यूबिक्स ढांचे पर मेरे काम के दौरान मुझे इसका सामना करना पड़ा।
मेरी वास्तविक समस्या में एक बाधा InjF f IdentL FunctionExpL
("एफ एक ऐसी भाषा है जहां पहचानकर्ताओं को फ़ंक्शन कॉल में फ़ंक्शन को इंगित करने के लिए उपयोग किया जा सकता है) शामिल है। मैं एक (overlappable) उदाहरण (FunctionIdent :<: f) => InjF f IdentL FunctionExpL
, जो typechecker पर छीन लेता है, मुझे एक नकली Could not deduce FunctionIdent :<: f
त्रुटि दे रही है।
यह त्रुटि बनी रहती है जब भी वहाँ एक विशिष्ट Foo
के लिए एक उदाहरण InjF Foo IdentL FunctionExpL
दायरे में है, इसलिए leftaroundabout का जवाब है, जो अनुमान लगाती है कि अन्य उदाहरण इस समस्या को ठीक करना चाहिए, पूरी कहानी नहीं है।
'{- # ओवरलैप्लेबल # -}' और '{- # LANGUAGE फ्लेक्सिबल कॉन्टैक्स # -} 'कुछ भी प्रभावित नहीं करते हैं। संकलन प्राप्त करने का एक और तरीका: 'चलो' बाध्यकारी में 'x :: Int' जोड़ें। – Alec
शायद सबसे बढ़िया बात यह है कि मॉड्यूल में all_ पर _no उदाहरण नहीं होने पर यह टाइपशेक भी होता है ... – leftaroundabout