Многие виды оптики имеют представление Ван Ларховена.
Например, 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
функцию Ван Ларховена?
Functor
иApplicative
сliftA2
, но не чистый, то это определило бы оптику с одной ко многим целям? У этого есть имя?Apply
в пакете "полугрупповых". hackage.haskell.org/package/semigroupoids-5.3.3/docs/...lens
пакете называетсяTraversal1
type Optional s t a b
действительно правильное представление для этой оптики, и что все соответствующие законы выполняются? Это похоже на магический трюк. Почему это было,Pointed
а не, скажемCopointed
,? Для другой данной оптики, как мы можем угадать правильное представление профессора?