2015-08-27 34 views
6

Napisałem dwa moduły. Pierwszy z nich nazywa DhtTypes:Funkcja z załadowanego modułu nie w zakresie

module DhtTypes (Bencode, encode, TransactionID, Hash20Bytes) where 

-- import stuff 

class Bencode a where 
    encode :: a -> ByteString.ByteString 

data TransactionID = TransactionID Int.Int16 
data Hash20Bytes = Hash20Bytes [Word.Word8] 

-- stuff 

Drugim jest MessageTypes:

module MessageTypes() where 

-- import stuff 

import DhtTypes 

data PingR = PingR TransactionID Hash20Bytes 

-- stuff 

To jest to, co się stało, kiedy załadować MessageTypes w GHCi:

GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 2] Compiling DhtTypes   (DhtTypes.hs, interpreted) 
[2 of 2] Compiling MessageTypes  (/home/{path}/MessageTypes.hs, interpreted) 
Ok, modules loaded: MessageTypes, DhtTypes. 
*MessageTypes> :browse DhtTypes 
class Bencode a where 
    encode :: a -> ByteString.ByteString 
data TransactionID = DhtTypes.TransactionID GHC.Int.Int16 
data Hash20Bytes = DhtTypes.Hash20Bytes [GHC.Word.Word8] 
*MessageTypes> Hash20Bytes 

<interactive>:3:1: Not in scope: data constructor `Hash20Bytes' 
*MessageTypes> :l DhtTypes 
[1 of 1] Compiling DhtTypes   (DhtTypes.hs, interpreted) 
Ok, modules loaded: DhtTypes. 
*DhtTypes> Hash20Bytes [0..10] 
Loading package array-0.4.0.1 ... linking ... done. 
Loading package deepseq-1.3.0.1 ... linking ... done. 
Loading package bytestring-0.10.0.2 ... linking ... done. 
Loading package bytestring-builder-0.10.6.0.0 ... linking ... done. 
a 
*DhtTypes> 

już czytać ghci not loading function from file i Beginning Haskell - getting “not in scope: data constructor” error, ale nadal nie mogłem znaleźć odpowiedzi.

Odpowiedz

8

Eksportujesz typ Hash20Bytes, ale nie eksportujesz konstruktora Hash20Bytes. Można zrobić tak jak to

module DhtTypes 
    (Bencode(..) 
    , TransactionID(..) 
    , Hash20Bytes(..) 
    ) where 

The (..) eksportuje wszystkie konstruktorzy/Członkowie/typeclass typu. Możesz podać rozdzielaną przecinkami listę nazw, jeśli chcesz eksportować tylko te, ale zwykle najlepiej jest jechać (..).