संपादित करती है: यहां एक वास्तव में सरल उदाहरण है। नीचे इस उदाहरण के लिए प्रेरणा।ghci के अनुमानित प्रकार हस्ताक्षर जोड़ने से त्रुटि
यह संकलित:
{-# LANGUAGE TypeFamilies #-}
type family F a b
f :: a -> F a b
f = undefined
f' [a] = f a
और GHCi की रिपोर्ट है कि:
*Main> :t f'
f' :: [a] -> F a b
लेकिन हम ऊपर फाइल करने के लिए इस प्रकार के हस्ताक्षर जोड़ते हैं, तो यह शिकायत:
*Main> :r
[1 of 1] Compiling Main (test.hs, interpreted)
test.hs:9:14:
Couldn't match type `F a b0' with `F a b'
NB: `F' is a type function, and may not be injective
In the return type of a call of `f'
In the expression: f a
In an equation for `f'': f' [a] = f a
Failed, modules loaded: none.
क्या देता है ?
प्रेरणा:
this question देखने के बाद, मैंने सोचा कि मैं एक स्मार्ट एलेक हो सकता है और एक छोटे से मजाक समाधान लिखना चाहते हैं। हमले की योजना टाइप-स्तरीय संख्याओं (सामान्य के रूप में) से शुरू होती है, फिर थोड़ा प्रकार-स्तरीय फ़ंक्शन Args n a c
लिखें जो n
a
की प्रतियां लेता है और c
उत्पन्न करता है। फिर हम विभिन्न n
के लिए एक छोटी प्रकार की कक्षा लिख सकते हैं और हमारे रास्ते पर जा सकते हैं। मुझे लगता है कि इस टाइप-जांच नहीं की खोज के लिए हैरान था
{-# LANGUAGE TypeFamilies #-}
data Z = Z
data S a = S a
type family Args n a c
type instance Args Z a c = c
type instance Args (S n) a c = a -> Args n a c
class OnAll n where
onAll :: n -> (b -> a) -> Args n a c -> Args n b c
instance OnAll Z where
onAll Z f c = c
instance OnAll n => OnAll (S n) where
onAll (S n) f g b = onAll n f (g (f b))
: यहाँ है कि मैं क्या लिखना चाहते है!
यह निश्चित रूप से उस उदाहरण को सरल बनाने के लिए समर्पित से अधिक प्रयास है! इससे पहले कि मैं इसमें गहराई से कोशिश करता हूं और खोदने से पहले, आप किस जीएचसी संस्करण का उपयोग कर रहे हैं? – ehird
@ehird मैंने ghc-7.2.2 और ghc-7.3.20111114 के साथ चेक किया। –
(मेरा संदेह, एफडब्ल्यूआईडब्लू, यह है कि यह जीएचसी में एक बग है। हालांकि, मुझे लगता है कि 'एनबी: 'Args' एक प्रकार का फ़ंक्शन है, और इंजेक्शन नहीं हो सकता है '' भी प्रासंगिक हो सकता है; बग बस में हो सकता है कैसे टाइप करें: टी' टाइप-चेकर के बजाए नाम या पसंद प्रदर्शित करता है।) – ehird