2015-08-27 24 views
6

Ho scritto due moduli. Il primo si chiama DhtTypes:Funzione dal modulo caricato non compreso nel campo

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 

La seconda è MessageTypes:

module MessageTypes() where 

-- import stuff 

import DhtTypes 

data PingR = PingR TransactionID Hash20Bytes 

-- stuff 

Questo è quello che succede quando carico MessageTypes in 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> 

ho già letto ghci not loading function from file e Beginning Haskell - getting “not in scope: data constructor” error, ma non riesco ancora a trovare una risposta.

risposta

8

Si sta esportando il tipo Hash20Bytes, ma non si sta esportando il costruttore Hash20Bytes. È possibile farlo in questo modo

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

Il (..) esporta tutti i costruttori/membri di un tipo/typeclass. È possibile specificare un elenco di nomi separati da virgole se si desidera esportare solo quelli specifici, ma di solito lo è (..) nella mia esperienza.