Haskell递归/循环模块定义?

时间:2011-12-27 23:25:57

标签: haskell types module

我有两个相互导入的模块。 Haskell不支持递归模块。那么如何在不需要循环模块系统的情况下重写我的数据类型。

这是我的Character.hs

module Character where
import ItemSystem

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

这是ItemSystem.hs

module Item where
import Character

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

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

更新:我将把我的所有数据类型写入一个模块:(。

2 个答案:

答案 0 :(得分:16)

为相互依赖的部分创建第三个模块:

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 }

然后从其他模块中导入它,并可选择从每个模块中重新导出所需的内容:

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

import Internal

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

import Internal

-- non-mutually dependent stuff

如果这是在Cabal包中,您可以将Internal模块放在Other-modules部分而不是Exported-modules中,以隐藏世界其他地方。

为了完整性:GHC does support mutually recursive modules,但对于像这样的简单案例,我不建议这样做。

答案 1 :(得分:5)

选项1:正如Hammar建议的那样,将相互依赖的部分拉入自己的模块中。

选项2:将所有内容放入同一模块中。

选项3:如果您正在使用GHC,则可以为其中一个模块创建hs-boot文件,并让另一个模块使用{-# SOURCE #-}编译实例导入该文件。