我有两个互相导入的模块。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 }
更新:我将把我的所有数据类型写到一个模块中:(。
发布于 2011-12-28 08:06:59
选项1:按照hammar的建议,将相互依赖的部分放入各自的模块中。
选项2:将所有内容放入同一个模块中。
选项3:如果您正在使用GHC,可以为其中一个模块创建一个hs-boot文件,并让另一个模块使用{-# SOURCE #-}
杂注导入该文件。
发布于 2021-08-17 14:17:52
您还可以使用参数...Character
不是Items
的固定类型wrt,而是一个参数类型。
module Character where
data BaseCharacter itemType = Character { name :: String, items :: [itemType] }
ItemSystem.hs
就变成了
module Item where
import Character
type Character = BaseCharacter Item
data ItemEffect = CharacterEffect (Character -> Character)
| ItemEffect (Item -> Item)
data Item = Item { name :: String, weight :: Int, effect :: ItemEffect }
https://stackoverflow.com/questions/8650297
复制相似问题