Haskell递归/循环模块定义?

Umu*_*dik 17 haskell types module

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

这是我的Character.hs

module Character where
import ItemSystem

data Character = Character { name :: String, items :: [Item] }
Run Code Online (Sandbox Code Playgroud)

这是ItemSystem.hs

module Item where
import Character

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

data Item = Item { name :: String, weight :: Int, effect :: ItemEffect }
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 18

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

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 }
Run Code Online (Sandbox Code Playgroud)

然后从其他模块导入它,并可选择从每个模块重新导出您想要的东西:

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

import Internal

-- non-mutually dependent stuff
Run Code Online (Sandbox Code Playgroud)
module Item (Item(..), ItemEffect(..), {- etc -}) where

import Internal

-- non-mutually dependent stuff
Run Code Online (Sandbox Code Playgroud)

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

为了完整性:GHC支持相互递归的模块,但我不建议像这样的简单情况.


red*_*der 5

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

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

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