2011-12-16 13 views
9

संपादित करती है: यहां एक वास्तव में सरल उदाहरण है। नीचे इस उदाहरण के लिए प्रेरणा।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 लिखें जो na की प्रतियां लेता है और 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)) 

: यहाँ है कि मैं क्या लिखना चाहते है!

+0

यह निश्चित रूप से उस उदाहरण को सरल बनाने के लिए समर्पित से अधिक प्रयास है! इससे पहले कि मैं इसमें गहराई से कोशिश करता हूं और खोदने से पहले, आप किस जीएचसी संस्करण का उपयोग कर रहे हैं? – ehird

+0

@ehird मैंने ghc-7.2.2 और ghc-7.3.20111114 के साथ चेक किया। –

+0

(मेरा संदेह, एफडब्ल्यूआईडब्लू, यह है कि यह जीएचसी में एक बग है। हालांकि, मुझे लगता है कि 'एनबी: 'Args' एक प्रकार का फ़ंक्शन है, और इंजेक्शन नहीं हो सकता है '' भी प्रासंगिक हो सकता है; बग बस में हो सकता है कैसे टाइप करें: टी' टाइप-चेकर के बजाए नाम या पसंद प्रदर्शित करता है।) – ehird

उत्तर

9

के रूप में निम्नलिखित द्वारा प्रदर्शन किया जा सकता है यह एक GHC बग है, यहां तक ​​कि आगे सरल उदाहरण:

type family F a 

f :: b -> F a 
f = undefined 

f' :: b -> F a 
f' a = f a 

मैं GHC मुख्यालय को इसकी रिपोर्ट सुझाव देते हैं।

+0

अच्छी टिप। मैं आपको अभी भी एक बेहतर कर दूंगा: 'परिवार एफ टाइप करें; एक्स, वाई :: एफ ए; एक्स = अपरिभाषित; वाई = एक्स'। –

+0

हा! आपने पिछले 2 की तुलना में आईआरसी से एक सरल उदाहरण में संपादित करने से पहले 2 9 सेकेंड का प्रबंधन किया था। खैर, कम से कम हम सुनिश्चित कर सकते हैं कि यह अब एक बग है ... – ehird

+1

इस उत्तर को स्वीकार करना; एक त्वरित अद्यतन देने के लिए, इस "बग" (?) को जीएचसी में एक प्रकार के एनोटेशन स्टॉप संकलन के बिना संस्करण बनाकर हल किया गया था। =) –

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