Bạn nói đúng, vì GHC không hỗ trợ các loại đa hình, nó sẽ làm loại mặc định là *
.
Tuy nhiên, sử dụng phần mở rộng KindSignatures
, bạn có thể chú thích rõ ràng tuyên bố dữ liệu với một loại cụ thể:
{-# LANGUAGE KindSignatures #-}
data Const (a :: * -> *) = Const Integer
Hoặc, nếu bạn là một fan hâm mộ của GADT s:
{-# LANGUAGE GADTs #-}
data Const :: (* -> *) -> * where
Const :: Integer -> Const a
Bạn có thể bây giờ viết:
x :: Const Maybe
x = Const 2
Tôi vừa biên soạn chương trình gốc với thử nghiệm Utrecht Haskell Compiler (UHC).
UHC không thực sự biên dịch bất kỳ chương trình thế giới thực nào, nhưng nó hỗ trợ đa hình loại! Sự can thiệp của nó để xem suy luận:
-- kind of data type:
Const :: forall a . a -> *
-- type of constructor:
Const :: Integer -> forall* a . forall b(a) . Const b
Nguồn
2010-01-07 20:00:08