2013-12-07 13 views
14

हैलो हास्केल समुदाय,जब GHCi में संकलित मॉड्यूल लोड हो रहा है

मैं हास्केल के लिए नया हूँ और कोई समस्या हुई थी जब मैं अपनी पहली बड़ी परियोजना की संरचना करने की कोशिश की त्रुटि 'इंटरफेस लोड करने में विफल'।

यहां समस्या का न्यूनतम उदाहरण है (मैं निर्माण करने के लिए कैबल का उपयोग कर रहा हूं)।

FooMod1 
|- FooMod1.cabal 
|- Setup.hs 
|- src 
    |- FooMod1.hs 
    |- FooMod1 
    |- C1.hs 
    |- T1.hs 

FooMod1.hs के लिए स्रोत:

module FooMod1 (
    C1(..) , 
    T1(..) , 
) where 

import FooMod1.C1 
import FooMod1.T1 

स्रोत C1.hs के लिए:

यह एक सरल मॉड्यूल की निर्देशिका संरचना है

module FooMod1.C1 (
    C1(..) 
) where 

class C1 a where 
    c1FooFun :: a -> IO() 

T1.hs के लिए स्रोत:

module FooMod1.T1 (
    T1(..) 
) where 

import FooMod1.C1 

data T1 = T1 deriving(Show) 

instance C1 T1 where 
    c1FooFun T1 = putStrLn "c1FooFun from T1" 

कबाल फ़ाइल के लिए स्रोत:

Name:      FooMod1 
Version:     0.0.1 
Cabal-version:    >=1.10 
Build-type:    Simple 

library 
    build-depends:   base >= 4 && < 5 
    if impl(ghc >= 7.0.0) 
    default-language:  Haskell2010 
    ghc-options:    -Wall 
    exposed-modules:   FooMod1 

    ghc-options:    -Wall -rtsopts 
    hs-source-dirs:   src, src/FooMod1 
    default-language:  Haskell2010 

और Setup.hs:

module Main where 

import Distribution.Simple 

main = defaultMain 

मैं बिना किसी समस्या के

cabal configure 
cabal build 
cabal install 

कर सकते हैं। जब मैं ghci और

import FooMod1 

यह मॉड्यूल लोड करता है और मैं डेटा कन्स्ट्रक्टर देख सकता हूं। लेकिन जब मैं उदाहरण

:t c1FooFun 

के लिए एक समारोह के प्रकार मिलता है या एक मूल्य मैं का निर्माण करने का प्रयास करें:

Failed to load interface for `FooMod1.C1' 
There are files missing in the `FooMod1-0.0.1' package, 
try running 'ghc-pkg check'. 
Use -v to see a list of the files searched for. 
In the expression: c1FooFun 

'GHC-pkg जांच' कुछ भी नहीं पता चलता है।

मुझे क्या याद आ रही है? मैंने इसे हास्केल 2010 मानक (http://www.haskell.org/onlinereport/haskell2010/haskellch5.html) में देखा और मुझे त्रुटि नहीं मिली। तो मेरे प्रश्न

1) मुझे यह त्रुटि क्यों मिल रही है?

2) क्या उस अच्छे अभ्यास की तरह पदानुक्रमित मॉड्यूल तैयार कर रहा है? (काफी बड़े कार्यक्रमों को मानें)

अग्रिम में बहुत धन्यवाद!

जूल्स

+3

मुझे लगता है कि आपकी कैबल फ़ाइल में 'अन्य मॉड्यूल:' लाइन गुम है। आपने इसे केवल 'FooMod1' मॉड्यूल के बारे में बताया है। मुझे यकीन नहीं है कि यह संकलन त्रुटि क्यों नहीं है। – asm

+0

@ एंड्रयू: आपको बहुत धन्यवाद कि समस्या थी ... क्या आप समाधान को उत्तर के रूप में दोबारा पोस्ट कर सकते हैं ताकि मैं इसे स्वीकार कर सकूं? – jules

उत्तर

7

संपादित करें: सितंबर वर्ष 2016

जब से मैं मूल रूप से इस सवाल का जवाब है कि अभी भी संपर्क में हैं Foo.Internal मॉड्यूल को परिभाषित करने की बढ़ती अभ्यास है। नीचे दिए गए मूल उत्तर में मैंने other-modules फ़ील्ड का उपयोग करने का सुझाव दिया। एक अभ्यास जो अब लोकप्रिय है Foo.Internal.* मॉड्यूल को परिभाषित करना है जो स्पष्ट रूप से समर्थित एपीआई का हिस्सा नहीं है। इस पैटर्न के लिए तर्कसंगत this question के उत्तरों में समझाया गया है।


टिप्पणियां अपने .cabal फ़ाइल other-modules लाइन याद आ रही है में बताया गया है। मुझे लगता है कि cabal install तब केवल FoodMod1 इंस्टॉल करता है क्योंकि यह सब कुछ बताया गया है।

उदाहरण के लिए आंतरिक मॉड्यूल बनाने का यह एक अच्छा तरीका है, उदाहरण के लिए, आपके कैबल पैकेज में उपयोग किए जाने वाले प्रकार जिन्हें आप पैकेज API में प्रकट नहीं करना चाहते हैं। चूंकि other-modules मॉड्यूल आपके पैकेज के बाहर से आयात नहीं किए जा सकते हैं, इसलिए यह आपको पैकेज निजी कार्यक्षमता बनाने की अनुमति देता है।

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