En mi tiempo libre, estoy aprendiendo Haskell, por lo que esta es una pregunta para principiantes.Entender cómo O bien es una instancia de Functor
En mis lecturas me encontré con un ejemplo que ilustra cómo se hace Either a
una instancia de Functor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Ahora, estoy tratando de entender por qué los mapas de aplicación en el caso de un constructor Right
valor, pero no en el caso de un Left
?
Aquí es mi entendimiento:
primer lugar quiero reescribir el ejemplo anterior como
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
Ahora:
Sé que
fmap :: (c -> d) -> f c -> f d
Si sustituimos
f
conEither a
obtenemosfmap :: (c -> d) -> Either a c -> Either a d
del tipo de
Right (g x)
esEither a (g x)
, y el tipo deg x
esd
, por lo que tenemos que el tipo deRight (g x)
esEither a d
, que es lo que esperamos defmap
(véase el punto 2 anterior)ahora, si nos fijamos en
Left (g x)
podemos utilizar el mismo razonamiento para decir que su tipo esEither (g x) b
, es decirEither d b
, que no es lo que esperamos defmap
(véase el punto 2 anterior): eld
debería ser el segundo parámetro ¡No el primero! Por lo tanto, no podemos asignar más deLeft
.
¿Mi razonamiento es correcto?
O es tal vez más, obviamente, un bifuntor que un Functor - un bifuntor tiene una operación BIMAP - BIMAP :: (a -> m) -> (b -> n) -> fab -> fm n. Esto le da un mapeo en ambos casos, Izquierda y Derecha. La biblioteca estándar de Haskell no tiene una clase Bifunctor, esto se debe a que hay muchos menos Bifunctors que Functors "en la naturaleza", aunque es útil para Either y pair (a, b). –
En 3, usa (g x) como parte de un tipo, pero es un valor. Parece que quisiste escribir 'typeof (g x)' allí, y no '(g x)' en sí mismo. – Peaker
@stephen tetley: ¡eso es interesante! Gracias – MarcoS