簡體   English   中英

如何在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表示法內,例如dynFlag <- getDynFlags ,其中m被進一步約束為Monad的實例。

我的問題是:

  • 對於HasDynFlags mm是否必須至少是Functor才能使此類型類有用?
  • 如果回答的第一個問題是否定的,那么,到底我們應該怎么去獲取的值DynFlagsgetDynFlags :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM