2012-01-04 22 views
30

मैं स्पष्ट रूप से टाइपक्लास उदाहरण कैसे आयात करूं? साथ ही, मैं एक योग्य आयात के साथ ऐसा कैसे करूं?स्पष्ट रूप से उदाहरणों को आयात करें

वर्तमान में, मैं

import Control.Monad.Error() 

कर रहा हूँ इकाई उदाहरण है कि मैं (Either String) के लिए उपयोग कर सकते हैं आयात करने के लिए। इससे पहले, मैं

import Control.Monad.Error 

मैं या तो एक से सन्तुष्ट न करते थे, क्योंकि Monad उदाहरण परोक्ष आयात किया जाता है।

उत्तर

45

उदाहरणों के आयात को नियंत्रित करने में असमर्थता व्यापार गत हास्केल typeclass प्रणाली बनाता है में से एक है। यहां एक काल्पनिक हास्केल बोली में एक उदाहरण है जहाँ आप कर सकते हैं:

Foo.hs:

module Foo where 

data Foo = FooA | FooB deriving (Eq, Ord) 

Bar.hs:

module Bar (myMap) where 

import Data.Map (Map) 
import qualified Data.Map as Map 

import Foo 

myMap :: Map Foo Int 
myMap = Map.singleton FooA 42 

Baz.hs:

module Baz where 

import Data.Map (Map) 
import qualified Data.Map as Map 

import Foo hiding (instance Ord Foo) 
import Bar (myMap) 

instance Ord Foo where 
    FooA > FooB = True 
    FooB > FooA = False 

ouch :: Map Foo Int 
ouch = Map.insert FooB 42 myMap 

यिक्स! सेट myMap उचित instance Ord Foo साथ बनाया गया था, लेकिन यह एक अलग, विरोधाभासी उदाहरण के साथ बनाए गए नक्शे के साथ संयुक्त किया जा रहा है।

ऐसा करने में सक्षम होने से होस्केल के खुली दुनिया धारणा का उल्लंघन होगा। दुर्भाग्य से, मुझे इसके बारे में सीखने के लिए एक अच्छा, केंद्रीकृत संसाधन नहीं पता है। यह section of RWH सहायक हो सकता है (मैंने "हैकेल खुली दुनिया धारणा" की खोज की)।

+0

मानचित्र, सेट नहीं। अच्छा उदाहरण, +1। –

+0

@DanielFischer: फिक्स्ड, धन्यवाद :) – ehird

+3

अर्थ है कि यदि उस मार्ग से जाने के लिए चाहते हैं, आप, उदाहरणों प्रथम श्रेणी बनाने के लिए इतना है कि एक मानचित्र इसके चारों ओर Ord शब्दकोश है ले जा सकता है के लिए होता है? –

7

आप नहीं कर सकते। उदाहरण हमेशा निहित निर्यात किए जाते हैं और इसलिए आप उन्हें स्पष्ट रूप से आयात नहीं कर सकते हैं। वैसे, Either e का Monad उदाहरण आजकल Control.Monad.Instances में है।

2

हालांकि आम तौर पर सही उत्तर होगा "नहीं, तुम नहीं कर सकते हैं", मैं इस खराब समाधान का सुझाव:

प्रतिलिपि + पेस्ट

वांछित के लिए पुस्तकालय स्रोत कोड पर एक नज़र डालें मॉड्यूल, और आवश्यक डेटा घोषणाओं, आयात, और फ़ंक्शन परिभाषाओं को अपने कोड में कॉपी/पेस्ट करें। उन उदाहरणों की प्रतिलिपि बनाएँ जिन्हें आप नहीं चाहते हैं।

हाथ में समस्या के आधार पर, ghc type system extensionsOverlappingInstances या IncoherentInstances हालांकि यह शायद base पुस्तकालयों के साथ किसी भी समस्याओं का समाधान नहीं होगा, एक वैकल्पिक समाधान हो सकता है।

+1

मुझे लगता है कि मैट चाहता था कि 'आयात फू (बार, छुपा उदाहरण बाज़)' की तुलना में 'आयात फू (उदाहरण बार बाज़)' जैसे कुछ कहने में सक्षम होना चाहिए। –

+0

@ डैनियल फिशर - ठीक है, हाँ। ऐसा करने में सक्षम होने की अनुपस्थिति में, हालांकि, अगर आपको पूरी तरह से ऐसी चीज करने की ज़रूरत है, तो कॉपी + पेस्ट एकमात्र "प्लान बी" समाधान है जिसे मैं सोच सकता हूं। जीएचसी को आपके इंस्टेंस का उपयोग करने के लिए मजबूर करने के लिए '{- # ThisInstanceTrumps # -}' जैसी टिप्पणी जोड़ने में भी अच्छा लगा सकता है, इसके बजाए अन्यथा जो भी उदाहरण हो सकता है। –

+4

वाह, यह वास्तव में एक भयानक सुझाव है। आपके द्वारा छोड़ी गई एकमात्र चीज मूल और आपकी प्रतिलिपि/चिपकने वाली परिभाषाओं के बीच बातचीत के लिए 'असुरक्षित वाणिज्य' का उपयोग कर रही है। –

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