簡體   English   中英

如何使用靈活類型變量將monadic函數作為參數傳遞?

[英]How can I pass a monadic function as an argument with a flexible type variable?

為潛在的模糊問題標題道歉 - 我不確定如何表達它,因為我對問題的理解很差。

基本上,我如何進行以下編譯? :-P

{-# LANGUAGE MultiParamTypeClasses #-}

class (Monad m) => MyClass m a where
  valM :: m (Maybe a)
  val  :: m a

f :: (MyClass m a) => (m a -> IO a) -> IO (a, Maybe a)
f g = do
  x <- g val
  yM <- g valM
  return (x, yM)

GHC(v8.2.2)抱怨a是一個剛性類型變量,似乎無法應對(g val)(g valM)可以產生不同類型值的想法。 我嘗試過使用RankNTypes但無濟於事。

是否有一個我可以用來幫助編譯器的擴展,或者從類型推斷的角度來看,我正在嘗試做什么概念?

你是正確的,你需要RankNTypes ,但你錯過了一個forall f的正確類型是:

f :: MyClass m a => (forall b. m b -> IO b) -> IO (a, Maybe a)

...因為傳遞給f的函數必須適用於任何結果類型,並且它不應與結果中的a相關。


值得注意的是,這種函數也稱為自然變換 ,自然變換包為這些函數提供了一個(~>)類型別名

type (~>) f g = forall a. f a -> g a

因此,使用該類型別名,您也可以像這樣編寫f

f :: MyClass m a => (m ~> IO) -> IO (a, Maybe a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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