Есть ли в представлении Ван Ларховена `Optional`


15

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

Например, Lensтип Lens s t a b может быть представлен как:

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

Аналогично, a Traversalможет быть представлен аналогичным образом, поменяв местами Functorограничение Applicative:

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

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

В Оптике Монокля иерархия Optional подходит между LensиTraversal

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

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

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

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

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

Ответы:


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
Это удобно для моего варианта использования, который представляет собой библиотеку Scala Optics «просто для удовольствия», где я написал иерархию функторов с нуля, и поэтому могу делать с ней все, что мне нравится. Правильно ли я думаю, что это говорит о том, что если бы у меня также был другой тип-класс между Functorи Applicativeс liftA2, но не чистый, то это определило бы оптику с одной ко многим целям? У этого есть имя?
— Джо

1
Это предполагает это. Я понятия не имею, как будет называться оптика.
— Карл

4
@Joe Этот промежуточный класс вызывается Applyв пакете "полугрупповых". hackage.haskell.org/package/semigroupoids-5.3.3/docs/...
— danidiaz

2
... и соответствующая оптика в lensпакете называетсяTraversal1
— Бенджамин Ходжсон

@Carl Как мы можем проверить, что это type Optional s t a bдействительно правильное представление для этой оптики, и что все соответствующие законы выполняются? Это похоже на магический трюк. Почему это было, Pointedа не, скажем Copointed,? Для другой данной оптики, как мы можем угадать правильное представление профессора?
— winitzki
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.