Есть ли в представлении Ван Ларховена `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.