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支持相互递归的模块,但我不建议像这样的简单情况.