2010-04-07 7 views
9

इस कोड को ठीक संकलित:समस्या जब प्रकार वर्गों और प्रकार परिवारों मिश्रण

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, 
    UndecidableInstances, FlexibleContexts, EmptyDataDecls, ScopedTypeVariables, 
    TypeOperators, TypeSynonymInstances, TypeFamilies #-} 
class Sel a s b where 
    type Res a s b :: * 

instance Sel a s b where 
    type Res a s b = (s -> (b,s)) 

instance Sel a s (b->(c,a)) where 
    type Res a s (b->(c,a)) = (b -> s -> (c,s)) 

लेकिन जैसे ही मैं आर विधेय GHC जोड़ने के रूप में विफल रहता है:

Illegal type synonym family application in instance: 
     b -> (c, Rec a) 
    In the instance declaration for `Sel a s (b -> (c, Rec a))' 
:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, 
    UndecidableInstances, FlexibleContexts, EmptyDataDecls, ScopedTypeVariables, 
    TypeOperators, TypeSynonymInstances, TypeFamilies #-} 
class Sel a s b where 
    type Res a s b :: * 

instance Sel a s b where 
    type Res a s b = (s -> (b,s)) 

class R a where 
    type Rec a :: * 
    cons :: a -> Rec a 
    elim :: Rec a -> a 
instance Sel a s (b->(c,Rec a)) where 
    type Res a s (b->(c,Rec a)) = (b -> s -> (c,s)) 

कि शिकायत

इसका क्या अर्थ है और (सबसे महत्वपूर्ण बात यह है कि मैं इसे कैसे ठीक करूं?

धन्यवाद

+2

कोड का पहला भाग मेरे लिए ठीक संकलित नहीं करता है। जीएचसी (6.12.1) ने 'विवादित पारिवारिक उदाहरण घोषणाओं' की शिकायत की है। – kennytm

उत्तर

12

टाइप परिवार एक-तरफा हैं: आप Rec a को अपने संगणित प्रकार में विस्तारित कर सकते हैं, लेकिन आप विस्तार से (विशिष्ट रूप से) विस्तार से Rec a पर जा सकते हैं। यह उदाहरण कार्यों के लिए अनुपयुक्त प्रकार के फ़ंक्शन के अनुप्रयोग बनाता है, क्योंकि वे लागू करने के लिए आवृत्ति को कभी भी ट्रिगर नहीं कर सकते हैं।

इसके बजाय आप की कोशिश कर सकते:

instance Rec a ~ reca => Sel a s (b->(c,reca)) 

यह कुछ और ही मतलब है: यह कहता है कि किसी भी समारोह b -> (c, reca) एक उदाहरण है, और फिर जब यह पूरी तरह मेल खाता है संकलक जांच करता है कि Rec a ~ reca। लेकिन यह आपके मामले में करना चाहते हैं कि यह काफी अच्छा हो सकता है।

1

Rec एक प्रकार निर्माता नहीं है; यह एक प्रकार का काम है। हो सकता है कि आप इसे केवल श्रेणी परिभाषा के मूल्य के प्रकार में उपयोग कर सकें, न कि कक्षा घोषणा में? मैं यहाँ जंगली अनुमान लगा रहा हूँ; मैं परिवारों के प्रकार के लिए सभी नियमों को समझ नहीं पा रहा हूं।

मैं इसे कैसे ठीक करने के लिए पता नहीं है, लेकिन कुछ बातें की कोशिश करने में शामिल हैं:

  • वर्ग Sel से छुटकारा और बस type family Res a s b :: * परिभाषित करते हैं। कक्षा तंत्र के बजाय type instance का उपयोग करें।

  • यह संभवतः संभव है कि data का उपयोग करके Rec इंजेक्शन बनाने में मदद मिलेगी, लेकिन मुझे ऐसा नहीं लगता है।

  • संभवतः — पर काम करने वाले भाषा एक्सटेंशन की सबसे छोटी संख्या में कटौती करें, इससे दूसरों के लिए आपकी सहायता करना आसान हो जाएगा, और यह संकलक भी मदद कर सकता है।

+1

'डेटा' का उपयोग करने के लिए स्विचिंग काम करेगी - उदाहरण के लिए डेटा परिवारों को अनुमति दी जाती है, जबकि समानार्थी परिवार टाइप नहीं होते हैं। –

1

इसका मतलब है कि टाइप प्रकारों की घोषणा करते समय आपको सिनोमिम परिवारों का उपयोग करने की अनुमति नहीं है। जीएचसी मैनुअल के सेक्शन "Type families and instance declarations" देखें।

एकमात्र तरीका जिसे आप ठीक कर सकते हैं उसे रिफैक्टर करना है ताकि इसे किसी भी तरह की आवश्यकता न हो।

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