최근에 Monads의 작동 방식에 대한 지식을 쌓아 왔습니다. 나는 또한 'Comonad' 의 개념을 소개했는데 , 이것은 모나드 의 역 이중으로 설명됩니다 . 그러나 머리를 감쌀 수는 없습니다.
Monads를 이해하기 위해 나는 나 자신을위한 비유를했다 :
Monads는 '컨베이어 벨트를 만드는 청사진'으로 볼 수 있습니다.
새로운 Monad (새로운 종류의 컨베이어 벨트 시스템)를 정의하려면 다음을 정의해야합니다.
- 컨베이어 벨트에 물건을 놓는 방법 (예 : 컨베이어 벨트 '시작') (
unit
또는로 알려진return
)- 컨베이어 벨트의 일부가 될 기계 (식)를 컨베이어 벨트에 연결하는 방법. (
join
또는bind
나>>=
).(현재 컨베이어 벨트를 가져 와서 내용물을 버리고로 알려진 새 컨베이어 벨트를 시작하는 세 번째 작업이
>>
있지만 매우 드물게 사용됩니다.)기계와 컨베이어가 올바르게 작동하려면 다음을 확인해야합니다.
- 컨베이어 벨트에 물건을 넣고 기계를 통과하는 경우 수동으로 기계를 통과 할 때와 출력이 같아야합니다. (왼쪽 신원)
- 이미 존재하는 컨베이어 벨트 사이에 컨베이어 벨트를 넣으려면 컨베이어 벨트가있는 컨베이어 벨트가 아니라 하나의 긴 컨베이어 벨트로 끝나야합니다. (오른쪽 신원)
- 기계 A를 수동으로 사용한 다음 컨베이어에 연결된 BC를 통해 결과를 전달하거나 컨베이어에 연결된 AB를 사용하여 C를 통해 결과를 수동으로 전달하는 경우 출력에는 문제가되지 않습니다. >> = b) >> = c) (a >> = (b >> = c)) (연관성) 과 같아야합니다.
가장 간단한 컨베이어 벨트는 단지 입력 만 받고 다음 표현으로 계속되는 컨베이어 벨트입니다. 이것이 바로 '파이프 라인'입니다.
또 다른 가능성은 값에 대한 조건이 충족 된 경우에만 다음 기계를 통과하게하는 것입니다. 즉, 중간에있는 일부 표현식에서 값이 더 이상 허용되지 않는 값으로 변경되면 나머지 표현식은 건너 뜁니다. 이것이 '아마도'모나드가 하스켈에서하는 것입니다.
머신에 전달하기 전이나 후에 값에 대해 다른 멋진 조건부 복사 / 변경 규칙을 수행 할 수도 있습니다. 예 : 파서 (여기서 표현식이 '실패'결과를 반환하는 경우 표현식 이전 의 값 이 출력으로 사용됨)
물론 그 비유는 완벽하지는 않지만 모나드의 작동 방식을 잘 표현하기를 바랍니다.
그러나 나는 코 모나드를 이해하기 위해이 비유를 머리에 돌리는 데 많은 어려움을 겪고 있습니다. 인터넷에서 Comonad가 정의한 소량의 정보에서 다음을 알고 있습니다.
extract
의 역순입니다return
. 즉, 값 을 가져옵니다. Comonad의이.duplicate
의 역수join
, 즉 하나의 코 모나드를 두 개 생성합니다.
그러나 Comonad를 추출하거나 복제 할 수 있다면 어떻게 Comonad를 인스턴스화 할 수 있습니까? 실제로 어떻게 사용할 수 있습니까? 나는 이 매우 놀라운 프로젝트 와 그것에 대해 이야기를 보았다 (불행하게도 거의 이해하지 못했습니다) Comonad가 기능의 어떤 부분을 정확하게 제공하는지 잘 모르겠습니다.
코 모나드 란 무엇입니까? 그들은 무엇에 유용합니까? 그들은 어떻게 사용될 수 있습니까? 그들은 먹을 수 있습니까?
IO
모나드 에 대해 이야기 할 때 도움이되는 모든 유사점을 찾지 못했습니다) 는 하스켈 런타임 시스템 main
입니다. 도 있습니다 unsafePerformIO
물론. Maybe
모나드를 "컨베이어 벨트 끝에 기계"가있는 것으로 생각 하려면을 사용할 수 있습니다 maybe
.
cobind
응용 프로그램을 시작할 때 쉼표 값을 생성하려면 설명을 바꾸면 쉼표 의 내부 표현에 유용한 기능이 있어야합니다.