Existe uma representação de van Laarhoven de `Opcional`

15

Muitos tipos de óptica têm uma representação de van Laarhoven.

Por exemplo, um Lensdo tipo Lens s t a b pode ser representado como:

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

Da mesma forma a Traversal, pode ser representado de maneira semelhante, trocando a Functorrestrição por Applicative:

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

Várias estruturas ópticas, como Monocle e Arrow, definem um tipo chamado Optional.

Na óptica do Monocle, a hierarquia Optional se ajusta entre LenseTraversal

Pelo que entendi: se um Traversalé como um Lensque pode ter de zero a muitos alvos, então um Optionalé como um Lensque pode ter de zero a um alvo.

No Monocle, Optionalé definido como um par de funções:

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

Os comentários no código-fonte do Monocle sugerem que também é possível representar um Optional"como um PLense mais fraco PPrism"

É possível representar uma função Optionalcomo van Laarhoven?

Joe
fonte

Respostas:

10

Haveria uma maneira de representá-lo se a hierarquia Functor / Applicative / Monad fosse mais refinada. Em particular:

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

Observe que o tipo provavelmente seria nomeado Affinena biblioteca de lentes se isso estivesse na hierarquia de classes.

Carl
fonte
11
Isso é conveniente para o meu caso de uso, que é uma biblioteca Scala Optics "apenas por diversão", onde escrevi a Hierarquia do Functor do zero e, portanto, pode fazer o que eu quiser. Estou certo ao pensar que isso sugere que, se eu também tivesse uma outra classe-tipo entre Functore Applicativecom liftA2, mas não pura, isso definiria uma óptica com um a muitos alvos? Isso tem um nome?
Joe
11
Isso sugere isso. Não tenho ideia do que a óptica seria chamada.
27419 Carl Carl
4
@ Joe Essa classe intermediária é chamada Applyno pacote "semigroupoids". hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... e a óptica correspondente no lenspacote é chamadaTraversal1
Benjamin Hodgson
@Carl Como podemos verificar se essa type Optional s t a bé realmente a representação correta para essa ótica e se todas as leis apropriadas são válidas ? Isso parece um truque mágico. Por que foi Pointede não, digamos Copointed,? Para outra ótica, como adivinhar a representação correta do profunctor?
winitzki 16/04