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

많은 유형의 광학 장치는 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 기능 등을?



답변

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클래스 계층 구조에서 깔끔하게 렌즈 라이브러리에 유형이 지정 될 수 있습니다 .


답변