2017-01-13 13 views
5

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:

enter image description here

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: enter image description here

Trong bức tranh này cả hai mũi tên (joinfmap 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))?

Trả lời

7

Tôi bị nhầm lẫn bởi thực tế là ví dụ này sử dụng các loại trường hợp, không phải loại. Bởi vì các đối tượng trong thể loại Hask là các kiểu, không phải là các cá thể của chúng.

Ví dụ sử dụng một thể hiện của một lớp , mà là chính nó một loại .


Trong Haskell, vâng, đây là cùng một đối tượng (loại). Các trường hợp của typeclass Monad phải là các nhà xây dựng kiểu và các nhà xây dựng kiểu được tiêm. Sau đó, phải rõ ràng là

X = X => M(X) = M(X) => M(M(X)) = M(M(X)) 

Bắt tại đây chỉ có nghĩa là chúng cùng loại, không có giá trị. Chỉ vì fmap joinjoin cả hai đều có thể có các loại riêng của chúng là Monad m => m (m (m a)) -> m (m a) không có nghĩa là chúng thực hiện tương tự.

Chúng không.

ghci> (fmap join) [[[1],[2],[3]]] 
[[1,2,3]]   
ghci> join [[[1],[2],[3]]] 
[[1],[2],[3]] 

Không phải tất cả các bản vẽ của danh mục đều phải là biểu đồ đi lại. :)

+1

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

6

Từ hình ảnh, bạn có thể thấy rằng fmap joinjoin sản xuất giá trị khác nhau của cùng một loại . Do đó, chúng không giống nhau, mặc dù thành phần với join cuối cùng tạo ra các giá trị giống hệt nhau.

Trong lý thuyết danh mục, epimorphism là hình thái g sao cho f1 . g == f2 . g ngụ ý rằng f1 == f2 là tốt. Trong trường hợp này, chúng ta có thể thấy rằng joinkhông phải một biến hình, bởi vì mặc dù fmap join . join == join. join, nhưng không đúng là fmap join == join.