如何在Haskell中处理这种循环模块依赖关系

如何在Haskell中处理这种循环模块依赖关系,haskell,cyclic-dependency,Haskell,Cyclic Dependency,层次结构的简化版本: module A where import MyState data A a = A (StateT MyState IO a) deriving (...) 现在有一个模块MyState: module MyState where import SomeType data MyState = MyState { st :: SomeType, ... } 最后,介绍循环依赖关系的模块: module SomeType where import A data

层次结构的简化版本:

module A where

import MyState

data A a = A (StateT MyState IO a) deriving (...)
现在有一个模块MyState:

module MyState where

import SomeType

data MyState = MyState { st :: SomeType, ... }
最后,介绍循环依赖关系的模块:

module SomeType where

import A

data SomeType = SomeType { f :: A (), ... }
正如您所看到的,我的SomeType导入了A,因为我们的一个字段需要它。一个是导入状态,它导入了引入循环依赖关系的某种类型


解决这种循环依赖性的方法是什么?谢谢。

从技术上讲,有一个
.hsboot
文件的概念,它允许您转发声明内容,但没有人使用它们。更好的方法是在同一个文件中定义它们,通常称为
Internal
,然后将该文件导入
A
MyState
中的所有三个文件,如果您愿意,您可以在其中定义进一步的操作。亚伯拉罕:我试着把它们放在一个文件中,但问题是在这个文件中有一个循环依赖项。如果我先输入“data A”,然后输入“data MyState”,然后输入“data SomeType”,那么编译器会说它不知道MyState(在状态转换器中),任何其他数据类型的混乱都会导致错误。还是我做错了什么?GHC指南:。但是,如果可以避免这种情况,@ksaveljev(可能在另一个问题中,但是…)您能给出一个单一模块版本出现错误的最小示例,以及确切的错误吗?@ksaveljev在单个文件中,Haskell通常具有完全的共同递归绑定。但是,如果您使用的是Haskell的任何模板,则可能会出现这种情况。要解决这个问题,只需将所有TH声明移到所有协递归声明下面。