코 모나드는 무엇이며 어떻게 유용합니까?


16

최근에 Monads의 작동 방식에 대한 지식을 쌓아 왔습니다. 나는 또한 'Comonad' 의 개념을 소개했는데 , 이것은 모나드 이중으로 설명됩니다 . 그러나 머리를 감쌀 수는 없습니다.

Monads를 이해하기 위해 나는 나 자신을위한 비유를했다 :

Monads는 '컨베이어 벨트를 만드는 청사진'으로 볼 수 있습니다.

새로운 Monad (새로운 종류의 컨베이어 벨트 시스템)를 정의하려면 다음을 정의해야합니다.

  1. 컨베이어 벨트에 물건을 놓는 방법 (예 : 컨베이어 벨트 '시작') ( unit또는로 알려진 return)
  2. 컨베이어 벨트의 일부가 될 기계 (식)를 컨베이어 벨트에 연결하는 방법. ( join또는bind>>=).

(현재 컨베이어 벨트를 가져 와서 내용물을 버리고로 알려진 새 컨베이어 벨트를 시작하는 세 번째 작업이 >>있지만 매우 드물게 사용됩니다.)

기계와 컨베이어가 올바르게 작동하려면 다음을 확인해야합니다.

  1. 컨베이어 벨트에 물건을 넣고 기계를 통과하는 경우 수동으로 기계를 통과 할 때와 출력이 같아야합니다. (왼쪽 신원)
  2. 이미 존재하는 컨베이어 벨트 사이에 컨베이어 벨트를 넣으려면 컨베이어 벨트가있는 컨베이어 벨트가 아니라 하나의 긴 컨베이어 벨트로 끝나야합니다. (오른쪽 신원)
  3. 기계 A를 수동으로 사용한 다음 컨베이어에 연결된 BC를 통해 결과를 전달하거나 컨베이어에 연결된 AB를 사용하여 C를 통해 결과를 수동으로 전달하는 경우 출력에는 문제가되지 않습니다. >> = b) >> = c) (a >> = (b >> = c)) (연관성) 과 같아야합니다.

가장 간단한 컨베이어 벨트는 단지 입력 만 받고 다음 표현으로 계속되는 컨베이어 벨트입니다. 이것이 바로 '파이프 라인'입니다.

또 다른 가능성은 값에 대한 조건이 충족 된 경우에만 다음 기계를 통과하게하는 것입니다. 즉, 중간에있는 일부 표현식에서 값이 더 이상 허용되지 않는 값으로 변경되면 나머지 표현식은 건너 뜁니다. 이것이 '아마도'모나드가 하스켈에서하는 것입니다.

머신에 전달하기 전이나 후에 값에 대해 다른 멋진 조건부 복사 / 변경 규칙을 수행 할 수도 있습니다. 예 : 파서 ​​(여기서 표현식이 '실패'결과를 반환하는 경우 표현식 이전 의 값 이 출력으로 사용됨)

물론 그 비유는 완벽하지는 않지만 모나드의 작동 방식을 잘 표현하기를 바랍니다.

그러나 나는 코 모나드를 이해하기 위해이 비유를 머리에 돌리는 데 많은 어려움을 겪고 있습니다. 인터넷에서 Comonad가 정의한 소량의 정보에서 다음을 알고 있습니다.

  • extract의 역순입니다 return. 즉, 값 가져옵니다. Comonad의이.
  • duplicate의 역수 join, 즉 하나의 코 모나드를 두 개 생성합니다.

그러나 Comonad를 추출하거나 복제 할 수 있다면 어떻게 Comonad를 인스턴스화 할 수 있습니까? 실제로 어떻게 사용할 수 있습니까? 나는 이 매우 놀라운 프로젝트그것에 대해 이야기를 보았다 (불행하게도 거의 이해하지 못했습니다) Comonad가 기능의 어떤 부분을 정확하게 제공하는지 잘 모르겠습니다.

코 모나드 란 무엇입니까? 그들은 무엇에 유용합니까? 그들은 어떻게 사용될 수 있습니까? 그들은 먹을 수 있습니까?


2
"코 모나드에서 추출하거나 복제 할 수만 있다면 어떻게 코 모나드를 인스턴스화 할 수 있습니까?" -질문으로 답해 드리겠습니다 . 모나드에 값을 올리고 시퀀스 계산 만 할 수 있다면 어떻게 모나드를 사용할 수 있습니까?
Benjamin Hodgson 2016 년

1
모나드의 "컨베이어 벨트 끝에있는 기계"(단, IO모나드 에 대해 이야기 할 때 도움이되는 모든 유사점을 찾지 못했습니다) 는 하스켈 런타임 시스템 main입니다. 도 있습니다 unsafePerformIO물론. Maybe모나드를 "컨베이어 벨트 끝에 기계"가있는 것으로 생각 하려면을 사용할 수 있습니다 maybe.
Benjamin Hodgson 2016 년

1
그러나 일련의 cobind응용 프로그램을 시작할 때 쉼표 값을 생성하려면 설명을 바꾸면 쉼표 의 내부 표현에 유용한 기능이 있어야합니다.
Benjamin Hodgson 2016 년

2
comonad 또는 모나드의 특정 인스턴스 명확하게 typeclasses을 구현하기 위해 단지 필요한 것보다 더 많은 기능을 할 수 있습니다
JK합니다.

2
범주 이론적 / 수학 측면 에서이 질문에 접근하지 않으면 이것이 도움이되지는 않지만 코모 나는 역수가 아니라 모나드 의 이중 이라는 것을 지적하고 싶었습니다 .
Jörg W Mittag 2016 년

답변:


11

코 모나드는 모나드와 마찬가지로 범주 이론의 수학적 구조입니다. 공동 접두어는 "반전"을 나타내는 데 매우 일반적입니다 (순수한 수학자들이 단어 선택에 동의하지는 않지만).

범주 이론에는 (모든 유형 또는 성격의 내부 구조는 무의미한) categories컬렉션 objectsarrows이러한 객체 사이에 일부 가 있습니다. 범주가되기 위해서는 화살표가 일부 법칙 (왼쪽 / 오른쪽 동일성 및 연관성)을 따라야하지만 여기서는 그다지 중요하지 않습니다.

이제 범주 이론은 매우 추상적이고 어려우며 광범위합니다. 모든 과정을 거치는 데 많은 시간이 필요합니다. (공식적으로 공부하지 않았고 몇 가지 기본 사항 만 알고 있습니다.)라는 개념이 dual있습니다. 기본적으로 모든 카테고리에 대해opposite category 대해 동일한 작업을 수행하지만 "모든 화살표를 뒤집 음"으로을 . 이것은 매우 순진한 정의이지만 요약하기가 어렵습니다. 카테고리 C의 이중은 기본적으로 반대 카테고리 C_op에서 동일합니다 (아직 두통이 있습니까?)

어쨌든, 어떤 카테고리에 모나드가 있고 카테고리가 예를 들어 객체가 일부 프로그래밍 언어의 유형이고 화살표가 유형 사이의 함수 인 카테고리 일 수 있다면, 코모 나는 기본적으로 동일한 것입니다. 모든 화살표를 뒤집 었습니다 (이 경우 함수 서명을 뒤집는 것과 같습니다).

더 "손에"설명 (안 SUPER 손에 불구하고이)에서 찾아 볼 수있다 그들이 이중성의 개념을 논의하고있다 에릭 마이어와 브라이언 베크 간의 토론 에릭은 "화살표를 반전"에 대해 어떻게 갔는지 IEnumerable<T>C #을 할 때에 반응 형 프레임 워크를 만들고 IObservable<T>(내가 말할 수있는 한 기본적으로 목록 코 모나드 인스턴스입니다).

비디오에 언급 된 코 모나드의 또 다른 실제 예는 Task<T>.NET 의 유형입니다. 여기서는 Task<U> ContinueWith<U>(Func<Task<T>, U>)이중 bind(또는 SelectManyC #에서 호출 됨)입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.