[英]How to use a typeclass like `HasDynFlags m` in GHC
在使用GHC代碼庫時,我發現了一個名為HasDynFlags
的類型類:
class HasDynFlags m where
getDynFlags :: m DynFlags
盡管類型類名稱看起來很不言自明,但在類型類定義中我找不到其他約束,即m
必須是Monad
或至少是Functor
這樣我們才能訪問該值。
但是,我在代碼庫中發現的大多數用法都在do表示法內,例如dynFlag <- getDynFlags
,其中m
被進一步約束為Monad
的實例。
我的問題是:
HasDynFlags m
, m
是否必須至少是Functor
才能使此類型類有用? DynFlags
給getDynFlags :: m DynFlags
,沒有任何進一步的知識m
? 根據類的定義,
class HasDynFlags m where
getDynFlags :: m DynFlags
m
由種類(* -> *)
。 類型m DynFlags
隱含了種類(* -> *)
,這表明m
是僅采用一個類型參數的類型構造函數。
在此, m
上沒有其他限制。 具體來說,雖然給定了Haskell中類型變量的通用命名約定,但生成的類型不必是Functor(或Monad),但Monad很有可能是有啟發性的案例。
編輯:要回答第二個問題,我們期望在更具體的上下文中引入我們希望的Functor或Monad類約束。 例如,考慮類型,
(HasDynFlags m, Monad m) => m DynFlags
我認為這就是全部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.