7
指定樣在這個聲明哈斯克爾 - 在數據聲明
data Const a = Const Integer
哈斯克爾推斷Const
是* -> *
。是否有可能讓Const
代替一個類型構造函數,所以它會是(* -> *) -> *
?理想情況下,它應該是a -> *
,但是沒有多態。 This thread顯示了一個解決方案 - 添加未使用的構造函數。自2002年以來情況有所改變嗎?
指定樣在這個聲明哈斯克爾 - 在數據聲明
data Const a = Const Integer
哈斯克爾推斷Const
是* -> *
。是否有可能讓Const
代替一個類型構造函數,所以它會是(* -> *) -> *
?理想情況下,它應該是a -> *
,但是沒有多態。 This thread顯示了一個解決方案 - 添加未使用的構造函數。自2002年以來情況有所改變嗎?
你是對的,因爲GHC不支持多態類型,它會默認爲*
。
但是,使用KindSignatures
擴展,可以明確地標註數據聲明與特定類型:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
或者,如果您的GADT個風扇:
{-# LANGUAGE GADTs #-}
data Const :: (* -> *) -> * where
Const :: Integer -> Const a
您現在可以寫:
x :: Const Maybe
x = Const 2
我剛剛編譯了實驗Utrecht Haskell Compiler(UHC)的原始程序。
UHC並不真正編譯任何真實世界的程序,但它支持類型多態性!其相互認爲推斷:
-- kind of data type:
Const :: forall a . a -> *
-- type of constructor:
Const :: Integer -> forall* a . forall b(a) . Const b