Hãy tưởng tượng rằng tôi có một giá trị chung trong đơn nguyên:đúng đắn của ngầm nâng
m :: (Monad m) => m A -- 'A' is some concrete type
Bây giờ chúng ta hãy nói rằng tôi chuyên giá trị này để một chồng đơn nguyên biến cụ thể theo hai cách riêng biệt:
m1 :: T M A
m1 = m
m2 :: T M A
m2 = lift m
... nơi M
và T M
là monads, và T
là một biến đơn nguyên:
instance Monad M where ...
instance (Monad m) => Monad (T m) where ...
instance MonadTrans T where ...
... và các trường hợp đó tuân theo luật đơn nguyên và luật biến áp đơn nguyên.
Chúng ta có thể suy luận rằng:
m1 = m2
... không biết gì về m
khác hơn loại của nó?
Đây chỉ là một cách yêu cầu dài nếu yêu cầu lift m
là sự thay thế hợp lệ cho m
, giả sử cả hai loại kiểm tra. Đó là một chút khó khăn để cụm từ câu hỏi bởi vì nó đòi hỏi m
loại kiểm tra như hai monads riêng biệt trước và sau khi thay thế. Theo như tôi có thể nói, cách duy nhất như một sự thay thế sẽ kiểm tra loại là nếu m
là chung chung trên đơn nguyên.
Trực giác mơ hồ của tôi là sự thay thế phải luôn đúng, nhưng tôi không chắc chắn rằng trực giác của tôi là chính xác hoặc cách chứng minh điều đó là đúng.
đây là "bằng chứng theo tham số" và có thể là điểm kinh nghiệm may mắn chính thức. Lập luận của bạn là đủ tốt mặc dù. –
Chắc chắn, đây chỉ là một bản phác thảo. Nhân tiện, tôi nên lưu ý rằng tôi đã bỏ qua 'thất bại'. Trong sự hiện diện của 'fail',' m' và 'lift m' có thể hoạt động khác nhau. (Không phải là có bất kỳ luật 'thất bại' nào, như vậy ... Nhưng với những biến thế đơn lẻ thực tế trong' mtl' bạn có thể tạo ra một ví dụ.) – shachaf
Tôi đặc biệt quan tâm đến giải thích về điều trị tham số, lý do là tôi có một vấn đề phức tạp hơn trong tâm trí của tôi về đường ống. Nếu bạn hoặc @PhilipJF giải thích rằng tôi sẽ chấp nhận câu trả lời này. –