7

Trong tuyên bố nàyHaskell - quy định cụ thể loại trong việc kê khai dữ liệu

data Const a = Const Integer 

Haskell suy luận rằng Const* -> *. Có thể làm cho Const thay thế một hàm tạo kiểu, vì vậy nó sẽ là (* -> *) -> *? Lý tưởng nhất, nó phải là a -> *, nhưng không có các loại đa hình. This thread hiển thị một giải pháp - thêm hàm tạo chưa sử dụng. Tình hình đã thay đổi từ năm 2002 chưa?

Trả lời

13

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 
Các vấn đề liên quan