Tôi đã gặp một tình huống kỳ lạ trong GHC 8.0.1 với GADT được đánh chỉ mục (?), Nơi giới thiệu yếm trong loại so với chữ ký loại. hành vi.'Loại' bị nhầm lẫn về forall trong GADT được đánh số loại
Hãy xem xét các kiểu dữ liệu sau:
{-# LANGUAGE TypeInType, GADTs, ExplicitForAll #-}
-- Same thing happens when we replace ExplicitForAll with ScopedTypeVariables
import Data.Kind
data F (k :: * -> *) where
data G :: F k -> * where
G :: G x
kiểu dữ liệu này biên dịch tốt. Tuy nhiên, nếu chúng ta muốn chỉ định loại x
trong hàm tạo G
, chúng tôi sẽ gặp lỗi kiểu.
data H :: F k -> * where
H :: forall k' (x :: F k'). H x
Các thông báo lỗi là
• Kind variable ‘k’ is implicitly bound in datatype ‘H’, but does not appear as the kind of any of its type variables. Perhaps you meant to bind it (with TypeInType) explicitly somewhere? • In the data declaration for ‘H’
Nếu chúng ta thêm forall
để chữ ký kiểu (có hoặc không có forall
trong constructor), không có lỗi.
data I :: forall k. F k -> * where
I :: I x
data J :: forall k. F k -> * where
J :: forall k' (x :: F k'). J x
Điều gì đang xảy ra?
chơi chữ thật sự tuyệt vời. A + – rampion
Có vẻ như trước đây khai báo 'F k' được sửa cho toàn bộ khai báo, trong khi cái sau cho phép' H' được sử dụng trong khai báo riêng của nó ở các loại khác nhau. I E. nó cho phép đệ quy polykinded. Có thể tương tự như sự khác biệt "thông số so với chỉ số" trong các loại quy nạp (như trong Agda/Coq). – chi
Dường như đây có thể là lỗi trình biên dịch (vừa được sửa). Tôi có thể sao chép thông báo lỗi của bạn bằng "ghc-8.0.1" nhưng nó biên dịch tốt với "ghc-8.0.1.20161117", phiên bản mới nhất "ngăn xếp" đã quyết định cài đặt cho tôi (và đó dường như là một ứng cử viên phát hành cho 8.0 .2). –