지퍼가 왜 코 모나드인지 이해
이 이전 질문에 대한 답변 에 대한 후속 조치 입니다.
각 항목의 a:A
을 함수 로 매핑 하고 생성 List[A]
을 가정해야 우리한다고 가정하십시오 .b:B
def f(a:A, leftNeighbors:List[A]): B
List[B]
나는 분명히 map
목록을 호출 할 수는 없지만 목록 지퍼를 사용할 수 있습니다 . 지퍼는 목록을 이동하는 커서입니다. 현재 요소 ( focus
) 및 제공 요소에 대한 액세스를 제공합니다 .
지금은 내를 대체 할 수 f
와 def f'(z:Zipper[A]):B = f(z.focus, z.left)
함께이 새로운 기능을 f'
에 cobind
의 방법 Zipper[A]
.
cobind
다음과 같이 작동이 있음을 호출 f'
지퍼로, 다음 지퍼를 이동 전화 f'
와 새가 "이동"지퍼, 다시 등등, 그래서 지퍼를 이동 ... 지퍼가 목록에 도달 할 때까지 할 수 있습니다.
마지막으로, cobind
유형의 새 지퍼를 반환 Zipper[B]
하여 목록으로 변환 할 수 있으므로 문제가 해결됩니다.
이제 cobind[A](f:Zipper[A] => B):Zipper[B]
와 사이 의 대칭에 주목하십시오. bind[A](f:A => List[B]):List[B]
이것이 List
a Monad
와 Zipper
a Comonad
입니다.
말이하세요?
이 질문이 "답변이없는"라는 질문이 "답변이없는"라고 대답했습니다. 1 년 전부터 훨씬 더 건설적인 내용은 없었습니다.
A List
는 여러 방법으로 Zipper
코 모나드로 볼 수있는 반면 모나드 (다양한 방법으로)로 캐스팅 할 수 있습니다. 차이점은 개념적으로 상태 머신 ( Monad
인터페이스에 관한 것)에 데이터를 건설적으로 "추가" 하거나 "해체 적으로"상태에서 " 추출 "하는 것 (즉, Comonad
수행하는 것)에 있습니다.
그러나 "이 이해가 의미가 있는가"라고 대답하기 쉬운 질문에 대답합니다. 어떤 의미에서는 의미가 없습니다.
참고 URL : https://stackoverflow.com/questions/24013339/understanding-why-zipper-is-a-comonad
'IT' 카테고리의 다른 글
Lodash를 사용하여 JavaScript 객체의 속성을 반복합니다. (0) | 2020.07.28 |
---|---|
C #에서 HTML을 구문 분석하는 가장 좋은 방법은 무엇입니까? (0) | 2020.07.28 |
BookSleeve의 ConnectionUtils.Connect ()를 사용하여 Redis 메시지 버스 장애 조치와 함께 SignalR 사용 (0) | 2020.07.28 |
스마트 포인터 : 누가 개체를 소유하고 있습니까? (0) | 2020.07.28 |
WiFi를 통해 한 Android 스마트 폰에서 다른 스마트 폰으로 라이브 스트림 비디오 (0) | 2020.07.28 |