在使用GHC代码库时,我找到了一个名为HasDynFlags
的类型类:
class HasDynFlags m where
getDynFlags :: m DynFlags
虽然类型类名称看起来不言自明,但我找不到其他名称
类型类定义中的约束m
必须Monad
或至少Functor
,因此我们可以访问该值。
但是,我在代码库中找到的大部分内容都是在一个记号中,例如dynFlag <- getDynFlags
其中m
进一步被约束为Monad
的一个实例。
我的问题是:
HasDynFlags m
,m
必须至少Functor
才能使此类型类有用吗?DynFlags
给定getDynFlags :: m DynFlags
的值,而无需进一步了解m
?答案 0 :(得分:1)
根据班级定义,
class HasDynFlags m where
getDynFlags :: m DynFlags
善意m
对 (* -> *)
表示满意。类型(* -> *)
隐含了类型m DynFlags
,它表明m
是一个只接受一个类型参数的类型构造函数。
此处m
没有进一步的限制。具体来说,结果类型不必是Functor(或Monad),虽然在Haskell中给出了类型变量的通用命名约定,Monad很有可能是激励案例。
编辑:要回答第二个问题,我们期望的Functor或Monad类约束会在更具体的上下文中引入。例如,考虑类型
(HasDynFlags m, Monad m) => m DynFlags
我认为这就是它的全部内容。