2017-01-13 18 views
5

제 질문은 하스켈의 모나드의 첫 번째 법칙에서 발생합니다 : join . fmap join = join . join. Haskell에서`join`과`fmap join`은 동일합니까 (범주 이론 관점에서)입니까?

Haskell/Category_theory에서이 법은 다음 그림으로 설명된다 :이 예는 유형이 아닌 유형의 인스턴스를 사용한다는 사실에 의해 혼란 스러워요

enter image description here

. 범주 Hask에있는 객체는 유형이므로 인스턴스가 아닙니다. enter image description here

을 모두 화살표 (joinfmap join)가 M(M(X))로 연결이 그림에서 :

그래서 내가 무엇을 가지고 여기 유형이 예제를 다시 그리려고합니다. 이 개체가 동일한 개체입니까, 아니면 두 개의 다른 M(M(X))이 있습니까?

답변

7

이 예제는 유형이 아닌 유형의 인스턴스를 사용한다는 사실에 혼란 스럽습니다. Hask 범주의 오브젝트는 유형이 아니며 인스턴스가 아니기 때문입니다.

예는 자체 타입 인클래스의 인스턴스를 사용한다.


하스켈에서 네, 이것은 같은 개체 (유형)입니다. Monad 유형의 인스턴스는 유형 생성자 여야하며 유형 생성자는 주입식이어야합니다. 그렇다면 꽤 명확해야합니다.

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

여기서 캐치는 단지 값이 아닌 동일한 유형이라는 것을 의미합니다. fmap joinjoin이 둘 다 Monad m => m (m (m a)) -> m (m a)에 특화된 그들의 유형을 가질 수 있다고해서 그들이 똑같은 일을한다는 것을 의미하지는 않습니다.

그렇지 않습니다.

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

모든 도면이 통근 다이어그램이 될 필요는 없습니다. :) 사진에서

+1

나는 (단지 의견)을 볼 수 있지만 결과 구조는 동일하지만 값은 그렇지 않습니다. 모나드 변압기에 비해 모나드의 요점은 무엇입니까? 'a'에 영향을 주지만 'm'은 남겨 둡니다. 'm'에 영향을 미치고 'a'를 남기는 모나드 변압기에 비해. – urbanslug

6

, 당신은 fmap joinjoin이 같은 유형다른 값을 생성 것을 볼 수 있습니다. 따라서, 구성join이 궁극적으로 동일한 값을 산출하더라도, 이들은 동일하지 않습니다.

epimorphismg이고 f1 . g == f2 . gf1 == f2을 의미합니다. 이 경우 join이 아닌 에피 모르 피어임을 알 수 있습니다. fmap join . join == join. join이지만 fmap join == join이 아니기 때문입니다.