簡體   English   中英

類型同義詞究竟是如何工作的?

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

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