Đây là kịch bản: Tôi đã viết một số mã có chữ ký loại và GHC phàn nàn không thể suy ra x ~ y cho một số x
và y
. Bạn thường có thể ném GHC một xương và chỉ cần thêm sự đồng hình vào các ràng buộc chức năng, nhưng đây là một ý tưởng tồi vì nhiều lý do:
- Nó không nhấn mạnh việc hiểu mã.
- Bạn có thể kết thúc với 5 ràng buộc trong đó một ràng buộc đã được xác định (ví dụ: nếu 5 bị ràng buộc bởi một ràng buộc cụ thể hơn)
- Bạn có thể kết thúc với các ràng buộc không có thật nếu bạn đã làm sai hoặc nếu GHC không có ích
Tôi mới dành vài giờ để chiến đấu với trường hợp 3. Tôi đang chơi syntactic-2.0
và tôi đang cố gắng xác định phiên bản độc lập với tên miền share
, tương tự như phiên bản được xác định trong NanoFeldspar.hs
.
Tôi đã có điều này:
{-# LANGUAGE GADTs, FlexibleContexts, TypeOperators #-}
import Data.Syntactic
-- Based on NanoFeldspar.hs
data Let a where
Let :: Let (a :-> (a -> b) :-> Full b)
share :: (Let :<: sup,
Domain a ~ sup,
Domain b ~ sup,
SyntacticN (a -> (a -> b) -> b) fi)
=> a -> (a -> b) -> a
share = sugarSym Let
và GHC could not deduce (Internal a) ~ (Internal b)
, đó chắc chắn không phải là điều tôi sẽ làm. Vì vậy, hoặc tôi đã viết một số mã mà tôi không có ý định (yêu cầu ràng buộc) hoặc GHC muốn ràng buộc đó do một số ràng buộc khác mà tôi đã viết.
Hóa ra tôi cần thêm (Syntactic a, Syntactic b, Syntactic (a->b))
vào danh sách ràng buộc, không ai trong số đó ngụ ý (Internal a) ~ (Internal b)
. Về cơ bản, tôi vấp phải những ràng buộc chính xác; Tôi vẫn không có một cách có hệ thống để tìm thấy chúng.
Câu hỏi của tôi là:
- Tại sao GHC đề xuất hạn chế đó? Không ở đâu trong cú pháp là có một ràng buộc
Internal a ~ Internal b
, vậy GHC đã lấy nó từ đâu? - Nói chung, những kỹ thuật nào có thể được sử dụng để truy tìm nguồn gốc của một ràng buộc mà GHC tin rằng nó cần? Ngay cả đối với các ràng buộc mà tôi có thể tự khám phá, cách tiếp cận của tôi về cơ bản là vũ phu buộc con đường vi phạm bằng cách viết ra các ràng buộc đệ quy. Cách tiếp cận này về cơ bản là đi xuống một lỗ thỏ vô hạn của các ràng buộc và là về phương pháp kém hiệu quả nhất mà tôi có thể tưởng tượng.
a
và b
bị ràng buộc - nhìn vào chữ ký loại bên ngoài bối cảnh của bạn - a -> (a -> b) -> a
, không phải a -> (a -> b) -> b
. Có lẽ đó là nó? Với các bộ giải ràng buộc, chúng có thể ảnh hưởng đến đẳng thức bắc cầu ở bất cứ đâu , nhưng các lỗi thường hiển thị vị trí "gần" với vị trí của ràng buộc được tạo ra. Điều đó sẽ rất tuyệt mặc dù @jozefg - có thể chú thích các ràng buộc với các thẻ hoặc một cái gì đó, để cho biết chúng đến từ đâu? : s