Есть ли в представлении Ван Ларховена `Optional` - PullRequest
15 голосов
/ 28 октября 2019

Многие виды оптики имеют представление Ван Ларховена.

Например, 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

Несколько оптических платформ, таких как Monocle и Arrow , определяют тип с именем Optional.

В Monocle's Optics heirarchy Optional подходит между Lens и Traversal

Как я понимаю: если Traversal походит на Lensкоторый может иметь от нуля до многих целей, тогда Optional похож на Lens, который может иметь от нуля до одной целей.

В Monocle Optional определяется как пара функций:

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

Комментарии в исходном коде Monocle предполагают, что также возможно представить Optional "как слабее PLens и слабее PPrism"

Можно ли представить Optional как функцию Ван Ларховена?

1 Ответ

10 голосов
/ 28 октября 2019

Был бы способ представить это, если бы иерархия 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 в библиотеке линз, если это было аккуратно в иерархии классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...