제 질문은 하스켈의 모나드의 첫 번째 법칙에서 발생합니다 : join . fmap join = join . join
. Haskell에서`join`과`fmap join`은 동일합니까 (범주 이론 관점에서)입니까?
. 범주 Hask
에있는 객체는 유형이므로 인스턴스가 아닙니다.
을 모두 화살표 (join
및 fmap join
)가 M(M(X))
로 연결이 그림에서 :
M(M(X))
이 있습니까?
제 질문은 하스켈의 모나드의 첫 번째 법칙에서 발생합니다 : join . fmap join = join . join
. Haskell에서`join`과`fmap join`은 동일합니까 (범주 이론 관점에서)입니까?
. 범주 Hask
에있는 객체는 유형이므로 인스턴스가 아닙니다.
을 모두 화살표 (join
및 fmap join
)가 M(M(X))
로 연결이 그림에서 :
M(M(X))
이 있습니까?
이 예제는 유형이 아닌 유형의 인스턴스를 사용한다는 사실에 혼란 스럽습니다. Hask 범주의 오브젝트는 유형이 아니며 인스턴스가 아니기 때문입니다.
예는 자체 타입 인클래스의 인스턴스를 사용한다.
하스켈에서 네, 이것은 같은 개체 (유형)입니다. Monad
유형의 인스턴스는 유형 생성자 여야하며 유형 생성자는 주입식이어야합니다. 그렇다면 꽤 명확해야합니다.
X = X => M(X) = M(X) => M(M(X)) = M(M(X))
여기서 캐치는 단지 값이 아닌 동일한 유형이라는 것을 의미합니다. fmap join
과 join
이 둘 다 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]]
모든 도면이 통근 다이어그램이 될 필요는 없습니다. :) 사진에서
, 당신은 fmap join
및 join
이 같은 유형의 다른 값을 생성 것을 볼 수 있습니다. 따라서, 구성과 join
이 궁극적으로 동일한 값을 산출하더라도, 이들은 동일하지 않습니다.
epimorphism은 g
이고 f1 . g == f2 . g
은 f1 == f2
을 의미합니다. 이 경우 join
이 이 아닌 에피 모르 피어임을 알 수 있습니다. fmap join . join == join. join
이지만 fmap join == join
이 아니기 때문입니다.
나는 (단지 의견)을 볼 수 있지만 결과 구조는 동일하지만 값은 그렇지 않습니다. 모나드 변압기에 비해 모나드의 요점은 무엇입니까? 'a'에 영향을 주지만 'm'은 남겨 둡니다. 'm'에 영향을 미치고 'a'를 남기는 모나드 변압기에 비해. – urbanslug