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