2013-09-02 57 views
7

Đây là Explanation of Monad laws trong Haskell.Giải thích luật Monad trong F #

Giải thích luật Monad trong F # như thế nào?

  1. bind (M, trở về) tương đương với M.

  2. bind ((cửa sổ mới x), f) là tương đương với f x.

  3. liên kết (liên kết (m, f), g) tương đương với liên kết (m, (vui x -> liên kết (f x, g))).

+3

Tại sao điều này yêu cầu giải thích? Đâu là phần khó khăn? –

+0

'ràng buộc (M, trả về)' không chính xác 'M', hãy nhớ rằng F # là không tinh khiết để ràng buộc có thể gây ra tác dụng phụ và đột biến. –

+0

Những quyền này có đúng không? – dagelee

Trả lời

10

Tôi nghĩ rằng cách tốt để hiểu chúng trong F # là xem xét ý nghĩa của chúng bằng cách sử dụng cú pháp biểu thức tính toán. Tôi sẽ viết m cho một số nhà xây dựng tính toán, nhưng bạn có thể tưởng tượng rằng đây là async hoặc bất kỳ loại tính toán nào khác.

sắc Left

m { let! x' = m { return x } = m { let x' = x 
    return! f x' }      return! f x' } 

sắc Ngay

m { let! x = comp    = m { return! comp } 
    return x } 

Associativity

m { let! x = comp    = m { let! y = m { let! x = comp 
    let! y = f x         return! f x } 
    return! g y }      return! g y } 

Các pháp luật về cơ bản cho bạn biết rằng bạn sẽ có thể cấu trúc lại một phiên bản của chương trình này sang chương trình khác mà không thay đổi ý nghĩa - giống như bạn có thể cấu trúc lại các chương trình F # thông thường.

+2

Ví dụ về tính tương hợp hơi khó hiểu: điều gì đã xảy ra với 'g' trong ví dụ mã đúng? Nếu dòng cuối cùng là 'return! g y'? –

+1

@ChristopherStevenson Tôi chỉ mất 4,5 năm để sửa lỗi đánh máy đó! –