7

指定樣在這個聲明哈斯克爾 - 在數據聲明

data Const a = Const Integer 

哈斯克爾推斷Const* -> *。是否有可能讓Const代替一個類型構造函數,所以它會是(* -> *) -> *?理想情況下,它應該是a -> *,但是沒有多態。 This thread顯示了一個解決方案 - 添加未使用的構造函數。自2002年以來情況有所改變嗎?

回答

13

你是對的,因爲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