Câu hỏi của tôi nảy sinh từ luật đầu tiên của các monads trong Haskell: join . fmap join = join . join
.`Tham gia` và` fmap tham gia` bằng Haskell (từ điểm lý thuyết Danh mục)?
Trong Haskell/Category_theory luật này được thể hiện bằng hình ảnh sau đây:
Tôi bối rối bởi thực tế rằng ví dụ này sử dụng trường hợp của các loại, không phải là loại. Bởi vì các đối tượng trong thể loại Hask
là các loại, không phải là các đối tượng của chúng.
Vì vậy, tôi đã cố gắng để vẽ lại ví dụ này với các loại, và đây là những gì tôi nhận được:
Trong bức tranh này cả hai mũi tên (join
và fmap join
) dẫn đến M(M(X))
. Đây có phải là cùng một đối tượng, hoặc có hai khác nhau M(M(X))
?
Tôi thấy (chỉ là một nhận xét), cấu trúc kết quả giống nhau nhưng giá trị thì không. Đó là điểm của monads, so với monad transformers: ảnh hưởng đến 'a' trong' m a' nhưng để lại 'm'; so với biến thế đơn nguyên sẽ ảnh hưởng đến 'm' và bỏ' a'. – urbanslug