मैं हैकेल टाइपसिस्टम की नीची किरदार में जा रहा हूं और प्रकार के वर्गों के ठीक बिंदुओं पर पहुंचने की कोशिश कर रहा हूं। मैंने एक ढेर सीखा है, लेकिन मैं कोड के निम्नलिखित टुकड़ों पर एक दीवार मार रहा हूँ।हास्केल प्रकार प्रणाली nuances
इन क्लास और उदाहरण परिभाषाओं का उपयोग करना:
लेकिन यह नहीं करता है:
class Show a => C a where
f :: Int -> a
instance C Integer where
f x = 1
instance C Char where
f x = if x < 10 then 'c' else 'd'
ऐसा क्यों है कि इस प्रकार के चेकर गुजरता है?
g :: C a => a -> Int -> String
g x y = show(f y)
मुझे दूसरा विकल्प अधिक पढ़ने योग्य लगता है, और ऐसा लगता है कि यह केवल मामूली अंतर है (प्रकार हस्ताक्षर नोट करें)। हालांकि, टाइपशेकर के पिछले अतीत को प्राप्त करने का प्रयास करने में परिणाम:
*Main> :l typetests.hs
[1 of 1] Compiling Main (typetests.hs, interpreted)
typetests.hs:11:14:
Ambiguous type variable `a0' in the constraints:
(C a0) arising from a use of `f' at typetests.hs:11:14
(Show a0) arising from a use of `show' at typetests.hs:11:9-12
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `show', namely `(f y)'
In the expression: show (f y)
In an equation for `g': g x y = show (f y)
Failed, modules loaded: none.
और मुझे समझ में नहीं आता क्यों।
नोट: कृपया पूछें कि "आप क्या करने की कोशिश कर रहे हैं?" मुझे उम्मीद है कि यह स्पष्ट है कि मैं इस भाषा के काम के तरीके की जांच करने के लिए एक अमूर्त संदर्भ में बस गड़बड़ कर रहा हूं। मेरे पास कुछ नया सीखने के अलावा दिमाग में कोई लक्ष्य नहीं है।
धन्यवाद
खूनी नरक! एसओ पर पहली पोस्ट और मुझे 24 घंटों से कम समय में तीन महान और अंतर्दृष्टिपूर्ण उत्तर मिलते हैं। यह जगह अद्भुत है। धन्यवाद दोस्तों – TheIronKnuckle