如何在 GHC 中使用像“HasDynFlags m”这样的类型类

How to use a typeclass like `HasDynFlags m` in GHC

在使用 GHC 代码库时,我发现了一个名为 HasDynFlags:

的类型类
class HasDynFlags m where
    getDynFlags :: m DynFlags

尽管类型类名称看起来不言自明,但我找不到其他名称 类型类定义中的约束表明 m 必须是 Monad 或至少 Functor 以便我们可以访问该值。

然而,我在代码库中发现它的大部分使用是在一个 do-notation 中,例如 dynFlag <- getDynFlags,其中 m 被进一步限制为 Monad 的一个实例。

我的问题是:

根据class定义,

class HasDynFlags m where
    getDynFlags :: m DynFlags

m满足种类(* -> *)。类型 (* -> *) 由类型 m DynFlags 隐含,这表明 m 是一个类型构造函数,仅采用一个类型参数。

此处m没有进一步的限制。具体来说,结果类型不必是 Functor(或 Monad),尽管在 Haskell 中给出了类型变量的通用命名约定,Monad 很可能是激励案例。

编辑:为了回答第二个问题,我们期望在更具体的上下文中引入 Functor 或 Monad class 约束。例如,考虑类型,

(HasDynFlags m, Monad m) => m DynFlags

我想就这些了。