2011-12-27 4 views
16

Birbirini içe aktaran iki modül var. Haskell, özyinelemeli modülleri desteklemiyor. Peki, veri tiplerimi ihtiyaç duymadan dairesel modül sistemine nasıl yazabilirim. . Burada Haskell özyinelemeli/dairesel modül tanımları?

benim Character.hs

module Character where 
import ItemSystem 

data Character = Character { name :: String, items :: [Item] } 

bir buraya ItemSystem.hs

module Item where 
import Character 

data ItemEffect = CharacterEffect (Character -> Character) 
       | ItemEffect  (Item -> Item) 

data Item = Item { name :: String, weight :: Int, effect :: ItemEffect } 

GÜNCELLEME olduğu: Bir modül :(içine benim bütün veri tiplerini yazacak

+0

tek bir modül –

+0

@AdamWagner ItemSystem sokabilirsin basit değildir. –

+0

Not GHC * yaptığı * desteği [bazı karşılıklı özyinelemeli modüller] (http://www.haskell.org/haskellwiki/Mutually_recursive_modules). Gerçi, gidiş almak için bir '.hs-boot' modülünü ihtiyaç arada – ehird

cevap

14

Oluştur karşılıklı olarak bağımlı parçalar için üçüncü modül:

module Internal where 

data Character = Character { name :: String, items :: [Item] } 

data ItemEffect = CharacterEffect (Character -> Character) 
       | ItemEffect  (Item -> Item) 

data Item = Item { name :: String, weight :: Int, effect :: ItemEffect } 

Sonra her birinden mevcut istediğiniz şeyler-ihracat yeniden isteğe bağlı olarak başka modüllerden hem içe ve:

module Character (Character(..), {- etc -}) where 

import Internal 

-- non-mutually dependent stuff 
module Item (Item(..), ItemEffect(..), {- etc -}) where 

import Internal 

-- non-mutually dependent stuff 

bu Cabal pakette ise, o zaman Internal modülünü gizleyebilirsiniz Exported-modules yerine Other-modules bölümüne koyarak dünyanın geri kalanından.

Tamlık için: GHC does support mutually recursive modules, ancak bunun gibi basit durumlarda bunu tavsiye etmem.

+0

Teşekkür ederim hammar. Bu durum için önerinizin daha iyi .hs-boot dosyası olduğunu tahmin ediyorum. –

5

Seçenek 1: hammar öne sürdüğü gibi, kendi modüle karşılıklı bağımlı parçaları çekin.

Seçenek 2: Aynı modül her şeyi koyun.

Seçenek 3: GHC kullanıyorsanız, modüllerinizden biri için bir hs-boot dosyası oluşturabilir ve diğer modülün bir {-# SOURCE #-} pragma ile içe aktarmasını sağlayabilirsiniz. i iki modüllere bölünmüş gerek nedenle yukarıdaki yazdığı gibi