[英]How exactly do type synonyms work?
如何進行,以下類型檢查
{-# LANGUAGE RankNTypes #-}
module Main where
class Foo a where
type FunFoo = (Foo a) => a -> IO ()
data Bar = Bar {
funFoo :: FunFoo
}
setFunFoo :: FunFoo -> Bar -> Bar
setFunFoo action bar = bar {funFoo = action}
但是當將setFunFoo的類型簽名更改為
setFunFoo :: ((Foo a) => a -> IO ()) -> Bar -> Bar
它不是? 有沒有一種方法來表達上面的代碼沒有類型同義詞FunFoo?
你需要像這樣添加一個明確的forall
:
setFunFoo :: (forall a. (Foo a) => a -> IO ()) -> Bar -> Bar
這是因為您希望類型變量a
的范圍限制為setFunFoo
的第一個參數的類型。 沒有明確的forall
,desugared類型是這樣的:
setFunFoo :: forall a. ((Foo a) => a -> IO ()) -> Bar -> Bar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.