如何在 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
的一个实例。
我的问题是:
- 对于
HasDynFlags m
,m
是否必须至少 Functor
才能使此类型类有用?
- 如果第一个问题的答案是否定的,那么我们应该如何在给定
getDynFlags :: m DynFlags
的情况下访问 DynFlags
的值,而无需进一步了解 m
?
根据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
我想就这些了。
在使用 GHC 代码库时,我发现了一个名为 HasDynFlags
:
class HasDynFlags m where
getDynFlags :: m DynFlags
尽管类型类名称看起来不言自明,但我找不到其他名称
类型类定义中的约束表明 m
必须是 Monad
或至少 Functor
以便我们可以访问该值。
然而,我在代码库中发现它的大部分使用是在一个 do-notation 中,例如 dynFlag <- getDynFlags
,其中 m
被进一步限制为 Monad
的一个实例。
我的问题是:
- 对于
HasDynFlags m
,m
是否必须至少Functor
才能使此类型类有用? - 如果第一个问题的答案是否定的,那么我们应该如何在给定
getDynFlags :: m DynFlags
的情况下访问DynFlags
的值,而无需进一步了解m
?
根据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
我想就这些了。