Apakah ada representasi van Laarhoven dari `Opsional`

15

Banyak jenis optik memiliki representasi van Laarhoven.

Misalnya, Lenstipe Lens s t a b dapat direpresentasikan sebagai:

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

Demikian pula a Traversal, dapat direpresentasikan dengan cara yang sama, menukar Functorkendala untuk Applicative:

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

Beberapa kerangka kerja optik, seperti Monocle dan Arrow menentukan jenis yang disebut Optional.

Dalam Optik Monocle, heirarki Optional cocok untuk LensdanTraversal

Seperti yang saya pahami: Jika a Traversalseperti a Lensyang mungkin memiliki nol hingga banyak target, maka a Optionalseperti a Lensyang mungkin memiliki nol ke satu target.

Di Monocle, Optionaldidefinisikan sebagai sepasang fungsi:

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

Komentar dalam kode sumber Monocle menunjukkan bahwa mungkin juga untuk mewakili Optional"sebagai yang lebih lemah PLensdan lebih lemah PPrism"

Apakah mungkin untuk mewakili Optionalfungsi van Laarhoven?

Joe
sumber

Jawaban:

10

Akan ada cara untuk mewakilinya jika hierarki Functor / Applicative / Monad lebih berbutir halus. Khususnya:

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

Perhatikan bahwa jenisnya mungkin akan dinamai Affinedi perpustakaan lensa jika itu rapi dalam hierarki kelas.

Carl
sumber
1
Ini sangat cocok untuk kasus penggunaan saya, yang merupakan "hanya untuk bersenang-senang" Perpustakaan Scala Optik di mana saya telah menulis Hirarki Functor dari awal, dan karena itu dapat melakukan apa pun yang saya suka dengannya. Apakah saya benar dalam berpikir bahwa ini menunjukkan bahwa Jika saya juga memiliki kelas tipe lain antara Functordan Applicativedengan liftA2, tetapi tidak murni, maka itu akan menentukan optik dengan satu ke banyak target? Apakah ini punya nama?
Joe
1
Itu memang menyarankan itu. Saya tidak tahu apa yang disebut optik.
Carl
4
@ Joel Kelas menengah itu disebut Applydalam paket "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... dan optik yang sesuai dalam lenspaket disebutTraversal1
Benjamin Hodgson
@Carl Bagaimana kita dapat memverifikasi bahwa ini type Optional s t a bmemang representasi yang tepat untuk optik itu, dan bahwa semua hukum yang sesuai berlaku? Ini seperti trik sulap. Mengapa itu Pointeddan tidak, katakanlah Copointed,? Untuk optik lain yang diberikan, bagaimana kita bisa menebak representasi profunctor yang benar?
winitzki