2011-12-27 35 views
16

Tôi có hai mô-đun nhập khẩu lẫn nhau. Haskell không hỗ trợ các mô-đun đệ quy. Vậy làm thế nào tôi có thể viết lại các kiểu dữ liệu của mình mà không cần hệ thống mô-đun vòng tròn.Định nghĩa mô-đun đệ quy/tròn Haskell?

Đây là Character.hs tôi

module Character where 
import ItemSystem 

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

một ở đây là ItemSystem.hs

module Item where 
import Character 

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

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

UPDATE:. Tôi sẽ viết tất cả các kiểu dữ liệu của tôi vào một module :(

+0

Bạn có thể đặt chúng trong một mô-đun –

+0

@AdamWagner ItemSystem không đơn giản như tôi đã viết ở trên vì vậy tôi cần chia thành hai mô-đun. –

+0

Lưu ý rằng GHC * có * hỗ trợ [một số mô-đun đệ quy lẫn nhau] (http://www.haskell.org/haskellwiki/Mutually_recursive_modules). – ehird

Trả lời

14

Tạo mô-đun thứ ba cho các bộ phận phụ thuộc lẫn nhau:

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 } 

Sau đó nhập nó từ cả các module khác và tùy chọn tái xuất khẩu những thứ bạn muốn có sẵn từ mỗi:

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

import Internal 

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

import Internal 

-- non-mutually dependent stuff 

Nếu đây là trong một gói Cabal, sau đó bạn có thể ẩn các module Internal từ phần còn lại của thế giới bằng cách đặt nó trong phần Other-modules thay vì Exported-modules.

Để hoàn thành: GHC does support mutually recursive modules, nhưng tôi không khuyến nghị rằng đối với những trường hợp đơn giản như thế này.

+0

Cảm ơn bạn hammar. Tôi đoán đề nghị của bạn là tốt hơn sau đó .hs-boot tập tin cho tình huống này. –

5

Tùy chọn 1: Như hammar đề xuất, hãy kéo các phần phụ thuộc lẫn nhau vào mô-đun của riêng chúng.

Tùy chọn 2: Đặt mọi thứ vào cùng một mô-đun.

Tùy chọn 3: Nếu bạn đang sử dụng GHC, bạn có thể tạo tệp hs-boot cho một trong các mô-đun của mình và yêu cầu mô-đun kia nhập mô-đun đó bằng {-# SOURCE #-} pragma.

Các vấn đề liên quan