如何在GHC中使用类似`HasDynFlags m`的类型类

时间:2015-07-04 04:24:33

标签: haskell ghc typeclass

在使用GHC代码库时,我找到了一个名为HasDynFlags的类型类:

class HasDynFlags m where
    getDynFlags :: m DynFlags

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

但是,我在代码库中找到的大部分内容都是在一个记号中,例如dynFlag <- getDynFlags其中m进一步被约束为Monad的一个实例。

我的问题是:

  • 对于HasDynFlags mm必须至少Functor才能使此类型类有用吗?
  • 如果第一个问题的答案为否,那么我们如何才能获得DynFlags给定getDynFlags :: m DynFlags的值,而无需进一步了解m

1 个答案:

答案 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

我认为这就是它的全部内容。