pattern - restricciones multiples haskell
¿Cuál es la derivación que muestra / x->(x, x) de Haskell equivalente a join(,)? (2)
Me gusta Aadits la respuesta intuitiva. Así es como lo averiguaría leyendo el código fuente.
- Voy a Hoogle
- Busco
join
- Hago clic en
join
- Hago clic en el botón "fuente" para acceder al código fuente para
join
- Veo que
join x = x >>= id
- Así que sé que
join (,) = (,) >>= id
- Busco
>>=
en Hoogle y hago clic en el enlace - Veo que es parte de la clase de tipos de mónada y sé que estoy tratando con
(,)
que es una función, por lo que hago clic en "fuente" en la instancia deMonad ((->) r)
- Veo que
f >>= k = /r -> k (fr) r
- Como tenemos
f = (,)
yk = id
, obtenemos/r -> id ((,) r) r
- Sooo ... nueva función!
id
Lo busco en Hoogle y hago clic en su código fuente. - Resulta
id x = x
- Así que en lugar de
join (,)
ahora tenemos/r -> ((,) r) r
- Que es lo mismo que
/r -> (,) rr
- Que es lo mismo que
/r -> (r,r)
Nunca olvide que los Haddocks se enlazan al código fuente de la biblioteca. Eso es muy útil cuando se trata de averiguar cómo funcionan las cosas juntas.
Según pointfree
:
/x -> (x, x)
es equivalente a:
join (,)
¿Cuál es la derivación que muestra esto?
Mira las firmas de tipo:
/x -> (x, x) :: a -> (a, a)
(,) :: a -> b -> (a, b)
join :: Monad m => m (m a) -> m a
Cabe señalar que ((->) r)
es una instancia de la clase de tipos Monad. Por lo tanto, en la especialización:
join :: (r -> r -> a) -> (r -> a)
Lo que hace la join
para las funciones es aplicar la función dada dos veces al mismo argumento:
join f x = f x x
-- or
join f = /x -> f x x
De esto, podemos ver trivialmente:
join (,) = /x -> (,) x x
-- or
join (,) = /x -> (x, x)
Qed.