Чи є представлення ван Лаарховена `Необов’язково '


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, де я написав Ієрархію функцій з нуля, і тому можу робити з нею все, що мені подобається. Я маю рацію, думаючи, що це говорить про те, що якщо я також мав інший тип класу між 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.