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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.