我有两个相互导入的模块。 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 }
更新:我将把我的所有数据类型写入一个模块:(。
答案 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 #-}
编译实例导入该文件。