2013-02-18 21 views
9

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 MT 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.

Trả lời

9

Nếu m :: Monad m => m A, sau đó m phải tương đương với return x đối với một số x :: A, bởi vì cách duy nhất bạn có để có được bất cứ điều gì :: m xreturn(>>=). Nhưng để sử dụng (>>=), bạn phải có khả năng sản xuất một số m y, bạn có thể làm với return hoặc bằng một ứng dụng khác là (>>=). Dù bằng cách nào bạn cũng phải sử dụng return và luật đơn lẻ đảm bảo rằng toàn bộ biểu thức sẽ tương đương với return x.

(Nếu m là hoàn toàn đa hình trên các đơn nguyên, sau đó bạn phải có khả năng sử dụng nó ở m ~ Identity, vì vậy nó không thể sử dụng bất kỳ thủ thuật đơn nguyên ưa thích, trừ khi bạn vượt qua nó một cuộc tranh cãi. Điều này loại lừa được sử dụng ví dụ herehere.)

Cho rằng m = return x, chúng tôi biết theo luật biến áp đơn nguyên (lift . return = return) rằng lift m = m.

Tất nhiên, điều này chỉ đúng với loại cụ thể này. Nếu bạn có, giả sử, m :: MonadState S m => m A, thì m có thể dễ dàng khác với lift m - ví dụ: với loại như StateT A (State A) A, getlift get sẽ khác.

(Và dĩ nhiên tất cả điều này được bỏ qua ⊥. Sau đó, một lần nữa, nếu bạn không, hầu hết monads không tuân thủ luật pháp anyway.)

+0

đâ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ù. –

+0

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

+0

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. –

2

Tôi tin rằng đây là một cẩu thả inductive proof rằng m của bạn là tương đương với lift m.

Tôi nghĩ chúng tôi phải cố gắng chứng minh điều gì đó về m (hoặc đúng hơn, về tất cả các giá trị có thể có của loại (Monad m) => m A). Nếu chúng ta xem xét Monad là bao gồm các ràng buộc và chỉ trả lại, và bỏ qua đáy và fail sau đó m phải của bạn ở cấp cao nhất là một trong:

mA = return (x) 
mB = (mX >>= f) 

Đối mA hai hình thức m tương đương của pháp luật đơn nguyên biến áp :

lift (return (x)) = return (x) 

Đó là trường hợp cơ bản. Sau đó, chúng tôi đang trái với pháp luật biến áp thứ hai để lý do về mB:

lift (mX >>= f) = lift mX >>= (lift . f) 

và nơi chúng tôi muốn chứng minh rằng mB của chúng tôi là tương đương với việc mở rộng rằng:

mX >>= f = lift mX >>= (lift . f) 

chúng tôi giả định rằng phía bên trái của liên kết là tương đương (mX = lift mX) vì đó là giả thuyết quy nạp của chúng ta (phải không?).

Vì vậy, sau đó chúng ta còn lại để chứng minh f = lift . f bằng cách tìm ra những gì f có để trông giống như:

f :: a -> m b 
f = \a -> (one of our forms mA or mB) 

lift . f trông giống như:

f = \a -> lift (one of our forms mA or mB) 

Những lá chúng tôi trở lại với giả thuyết của chúng tôi:

m = lift m 
Các vấn đề liên quan