[英]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.