2014-05-10 23 views
7

khai này không hoạt động:GHC không chấp nhận GADT loại chữ ký

data Identity a where {Identity :: (->) a (Identity a)} 

Làm thế nào để sửa lỗi này?

+11

Sử dụng dạng infix của '->'. Tôi không có ý tưởng tại sao nó tạo ra sự khác biệt nhưng thực sự là vậy. (ví dụ: 'dữ liệu ... trong đó {Identity :: a -> Identity a}') – jgriego

+4

Điều này có thể được báo cáo là lỗi nếu nó chưa được thực hiện. – kosmikus

+7

@ qu4ntumcpa: sự khác biệt là chữ ký trong các khai báo hàm tạo của GADT có thể bao gồm các chú thích nghiêm ngặt ('!'), Không được phép ở bất kỳ nơi nào khác. Tôi nghi ngờ GHC có hai ngữ pháp riêng biệt cho chữ ký GADT và các chữ ký khác. Ngoài ra, tôi có thể tưởng tượng một số đối số (yếu!) Mà các hàm tạo không thực sự hoạt động, và cú pháp tiền tố '(->)' loại gợi ý bạn có thể tự do tổng quát hóa nó (điều này không đúng, một lần nữa vì '!'). –

Trả lời

2

Ít nhất là của GHC 7.8, nếu bạn bật hỗ trợ GADT, sau đó typechecks mã của bạn và làm những gì bạn mong muốn:

{-# LANGUAGE GADTs #-} 
data Identity a where {Identity :: (->) a (Identity a)} 

kết quả là:

GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (foo.hs, interpreted) 
Ok, modules loaded: Main. 
λ» :i Identity 
data Identity a = Identity a -- Defined at foo.hs:2:1 
+0

Không hoạt động trong GHC 7.6. – ThePiercingPrince

Các vấn đề liên quan