Zipper가 Comonad 인 이유 이해


112

이것은 이전 질문에 대한 답변 에 대한 후속 조치 입니다.

나는 각 항목을 매핑 할 필요가 가정 a:AList[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입니다 MonadZipper입니다 Comonad.

말이 되나요?


1
나는 전문가는 아니지만 그것은 나에게 의미가 있습니다. 나는 당신의 설명을 읽는 동안 깨달음을 얻었습니다. 감사!
acjay

7
귀하의 질문은 SO 형식으로 대답하기가 매우 어렵지만 절대적으로 정확합니다. 요소 중심 지퍼는 항상 코 모나드입니다.
J. Abrahamson

4
List는 여러 가지 방법으로 comonad로 볼 수 있지만 Zipper는 모나드로 캐스팅 할 수 있습니다 (여러 가지 방법으로도). 차이점은 개념적으로 데이터를 상태 머신에 건설적으로 "추가"하는 데 초점을 맞추는 지 (모나드 인터페이스의 의미) 또는 "해체 적으로"상태를 "추출"하는지 (Comonad가 수행하는 작업)에 있습니다. 그러나 "이 이해가 타당합니까"라는 질문에 대답하는 것은 쉽지 않습니다. 어떤 의미에서는 그렇고, 다른 의미에서는 그렇지 않습니다.
KT.

2
무언가를 코 모나드로 캐스트하려면 두 가지 작업을 제공해야합니다. 1) 값 추출 (예 : 목록의 선두 일 수 있음) 및 2) 목록 처리 작업 적용 (예 : 슬라이딩 방식으로 적용 할 수 있음) 적절한 단위 변환이 목록을 변경하지 않는다는 가정하에 목록을 따라 또는 요소 별 방식 등으로 창 방식). 이러한 목록 처리 방법이 의미가 있는지 여부는 별도의 문제입니다. 베어 comonad 인터페이스는 목록을 구성하거나 탐색하는 방법을 제공하지 않습니다. 목록 인식 작업을 사용하는 방법 만 알고 있습니다.
KT.

2
@eenblam 당신이 맞습니다. 나는 대답을 추가 할 것이고 그것은 대답되지 않은 목록에서이 질문을 제거 할 것이다. 나는 희망한다
Michael

답변:


1

이 질문은 "답변이없는"목록의 맨 위에 정기적으로 나타나므로 여기에 내 의견을 답으로 복사 해 보겠습니다. 어쨌든 1 년 전 이후로 더 건설적인 것은 없었습니다.

List 는 (여러 가지 방법으로) comonad로 볼 수있는 반면, a Zipper는 (여러 가지 방법으로도) 모나드로 캐스팅 될 수 있습니다. 차이점은 개념적으로 데이터를 상태 머신에 건설적으로 "추가"하는 데 초점을 맞추는 지 ( Monad인터페이스가 무엇인지 ) 아니면 "해체 적으로"상태를 "추출"하는지 (그것이하는 일입니다 Comonad)입니다.

그러나 "이 이해가 타당합니까"라는 질문에 대답하는 것은 쉽지 않습니다. 어떤 의미에서는 그렇고, 다른 의미에서는 그렇지 않습니다.

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