`선택적`의 van Laarhoven 표현이 있습니까?


15

많은 유형의 광학 장치는 van Laarhoven 표현을 가지고 있습니다.

예를 들어, Lens유형 Lens s t a b 은 다음과 같이 나타낼 수 있습니다.

 Functor f => (a -> f b) -> s -> f t

유사하게는 Traversal, 스와핑, 비슷한 방법으로 표현 될 수 Functor에 대한 제약 조건을 Applicative:

 Applicative f => (a -> f b) -> s -> f t

MonocleArrow 와 같은 여러 광학 프레임 워크 는이라는 유형을 정의합니다 Optional.

단안경의 광학 계층 구조의에서 Optional 사이 적합 Lens하고Traversal

내가 알고있는 것처럼 : A는 경우 Traversal는 A입니다 Lens가질 수 많은 제로 목표를, 다음은 Optional유사한입니다 Lens가질 수 제로 하나에 목표를.

Monocle에서 Optional함수 쌍으로 정의됩니다.

getOrModify :: s -> Either t a 
set :: (b, s) -> t

단안경 소스 코드의 댓글은 그것이를 대표하는 수도 있습니다 제안 Optional"약한으로 PLens약한 PPrism"

대표 할 수 있습니까 Optional 밴 Laarhoven 기능 등을?

답변:


10

Functor / Applicative / Monad 계층 구조가 더 세분화 된 경우이를 나타내는 방법이 있습니다. 특히:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

Affine클래스 계층 구조에서 깔끔하게 렌즈 라이브러리에 유형이 지정 될 수 있습니다 .


1
Functor Hierarchy를 처음부터 작성했던 "재미있는 스칼라 광학 라이브러리"인 유스 케이스에 편리하게 사용할 수 있습니다. 나는 이것이 with FunctorApplicativewith 사이에 또 ​​다른 type-class를 가지고 liftA2있지만 순수하지 않다면 , 그것은 one에서 many로 광학을 정의 할 것이라고 생각합니다. 목표로 습니까? 이름이 있습니까?
Joe

1
그것은 제안합니다. 나는 광학 장치가 무엇을 불렀는지 전혀 모른다.
Carl

4
@Joe 중간 클래스는 Apply"세미 그룹 형"패키지에서 호출 됩니다. hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz

2
... 그리고 lens패키지 의 해당 광학 장치는Traversal1
Benjamin Hodgson

@Carl 이것이 type Optional s t a b실제로 해당 광학계에 대한 올바른 표현이며 모든 해당 법률에 적용 되는지 어떻게 확인할 수 있습니까? 이것은 마술 같은 것 같습니다. 왜 Pointed그렇지 Copointed않습니까? 또 다른 주어진 광학의 경우 올바른 profunctor 표현을 어떻게 추측 할 수 있습니까?
winitzki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.