7

Bu beyandaHaskell - veri beyanında tür belirtme

data Const a = Const Integer 

Haskell, Const'un * -> * olduğunu bildirir. Xzx11 yerine bir tür kurucu almak mümkün, bu yüzden (* -> *) -> * olacak? İdeal olarak, a -> * olmalıdır, ancak polimorfik tür yoktur. This thread bir çözümü - kullanılmayan kurucu ekleyerek gösterir. Durum 2002'den beri değişti mi?

cevap

13

Doğru değil, çünkü GHC, polimorfik türleri desteklemiyorsa, * için varsayılan ayarlamalar yapılacaktır.

Ancak KindSignatures uzantısını kullanarak, açıkça belirli bir tür veri beyanı açıklama yapabilirsiniz:

{-# LANGUAGE KindSignatures #-} 

data Const (a :: * -> *) = Const Integer 

Veya GADT s sizin hayranı, eğer:

{-# LANGUAGE GADTs #-} 

data Const :: (* -> *) -> * where 
    Const :: Integer -> Const a 

Artık şunları yapabilirsiniz yok:

x :: Const Maybe 
x = Const 2 

Sadece orijinal programı deneysel Utrecht Haskell Compiler (UHC) ile derledim.

UHC, gerçek dünya programlarını gerçekten derlemez, ancak tür polimorfizmini destekler! Bunu görmezden gelmek için interveeting: