2017-01-12 18 views
2

는 그 기사에서 definition of monad입니다 :Haskell의 모든 Monad 인스턴스가 Hask에서 Hask 로의 맵핑을위한 다른 방법입니까? 여기 <a href="https://en.wikibooks.org/wiki/Haskell/Category_theory" rel="nofollow noreferrer">Haskell/Category theory</a>을 읽고 있어요

모나드는 몇 가지 추가적인 구조를 지원하는 같은 카테고리 범주에서 펑터의 특별한 유형이다. 따라서 정의까지.

단위 : C의 모든 오브젝트 X 두 morphisms 함께 C-> C : 모나드는 펑 M 인 X -> M (X)

가입 : M (M (X)) -> M (X)

내가 알고있는 것처럼, 하스켈 return에서이 unit에 해당합니다.

x :: [Int] -- x is a member of Lst category 
x = return 5 

을이 하스켈에서 유효 코드 : 그러나 return와 나는 쓸 수 있습니다. 지금 보시는 것처럼 5Lst의 회원이 아니며 return이 적합합니다. C-> C :

그래서, LstM에서하지 С이라고 생각한다. 그런데 누가?

아마 정답은 Hask,하지만 난 "의 하위 범주에 카테고리에서 펑은" "같은 범주에 카테고리에서 펑"와 동일한 지 모르겠어요.

+0

'Hask'란 무엇입니까? – Thilo

+0

이것은 "Haskell/Categry theory"에서 나온 것입니다 : "이 기사에서 다루는 주요 범주는 하스켈 (Haskell)이며 하스켈 형식을 대상으로 취급하고 하스켈은 형태 상으로 기능합니다 ..." – azaviruha

+1

'M : C -> C '는 클래스 모나드에서'm'에 해당하고'C'는'Hask' 카테고리이지만 '.. : C -> C'에서는'C'가 객체를 참조하고 있습니다. 이 경우에는 유형 인 'C'의. 나는 M : Obj (C) -> Obj (C)'를 쓰는 것이 더 정확하다고 가정합니다. – user2407038

답변

7

이것은 혼란의 공통점이며 사용자가 답변 할 수있을만큼 분명하게 질문했습니다.

내가 "는 하위 범주의에 카테고리에서 펑은" "같은 범주에 범주에서 펑"와 동일한 지 모르겠어요.

동일하지 않습니다. Functor는 소스 카테고리 C, 대상 카테고리 D, D의 객체와 C의 객체의 매핑, D의 M의 변형과 C의 변형을 몇 가지 조건을 충족시키는 4 가지 데이터로 구성됩니다. D를 변경하면 펑터가 변경됩니다.

그러나 우리가 펑터를 정의 할 때, 우리는 카테고리 D에서 어떤 선택을 종종합니다.나는 LstLstLst의 형태가 무엇인지 확실하지 않지만 [a] 형식의 객체 인 Hask의 하위 범주라고 추측합니다. >Lst (즉, []의 대상 범주가 Lst)

  • [] - Hask :

    1. [] : 우리는 펑이 두 가지 형태 중 하나의 [] 정의 할 수 Hask ->Hask을 (즉, , 대상 카테고리 []Hask 임)

    이들은 기술적으로 다른 펑터이며 선택을해야합니다. 이 문맥에서 올바른 선택은 선택 2입니다. []의 결과에 []을 적용해야하므로 소스 및 대상 범주가 동일해야합니다 (join). 따라서 C = Hask 및 = []입니다.

    일반적으로 어떤 형식 생성자의 이미지로 정의 된 Lst과 같은 범주는 고려하는 것이 유용하지 않은 것으로 나타났습니다. 나는이 (아주 일반적인) 생각이 어디서 오는지 확실하지 않다. 나는 "카테고리 Lst"이라는 아이디어를 제쳐두고 권장한다. 하나의 범주만으로도 충분합니다!

    비유하자면 실수 f (x) = x^2를 제곱하는 함수를 생각해보십시오. 이것을 f (x)가 음수가 아닌 실수 값만 취하는 경우에도 f : R -> R을 실수로부터 실수로 함수 f : R로 볼 수 있습니다. f의 목표는 f의 이미지와 동일 할 필요는 없습니다 (입력 값에서 f가 실제로 얻는 값).

  • +0

    고맙습니다. 대답은 매우 유용합니다! – azaviruha

    0

    모나드는 정의에 따라 endofunctor입니다. Functor은 실제 endofunctor를 나타냅니다. Functor의 인스턴스는 유형을 가져 와서 새 유형을 반환하는 유형 수준 함수 인 유형 생성자에 대해 정의됩니다. 즉, 유형이 * -> *입니다.

    return :: Monad m => a -> m a이기 때문에 Int 값을 취할 수 있으며 [Int] 값을 반환 할 수 있습니다.