haskell - sirve - Control.Categoría, ¿qué significa>>> y<<<?
que es haskell pdf (1)
Como Hackage y / o Hoogle te dirán,
(>>>) :: Category k => a`k`b -> b`k`c -> a`k`c
(<<<) :: Category k => b`k`c -> a`k`b -> a`k`c
Observe que este último es en realidad el mismo que
(.) :: Category k => b`k`c -> a`k`b -> a`k`c
o, en su forma Prelude
, especializada en la categoría de funciones Hask ,
(.) :: (b->c) -> (a->b) -> (a->c)
Entonces, <<<
y >>>
simplemente componen funciones, o más generalmente morfismos / flechas.
<<<
compone en la misma dirección que la familiar .
, mientras >>>
cambia los argumentos para que "los datos fluyan de izquierda a derecha".
Ahora, lo que significa la composición de la flecha, para categorías distintas de Hask , depende, por supuesto, de la categoría. Kleisli IO
es un ejemplo fácil de entender: digamos que tenemos una función pura
pipe :: Double -> String
pipe = show . sqrt . (+2) . abs
Como dije, esto también puede ser escrito.
pipe = abs >>> (+2) >>> sqrt >>> show
Ahora, si desea agregar un registro de E / S primitivo (como lo haría en un lenguaje imperativo), puede introducir
type (-|>) = Kleisli IO
abs'', add2'', sqrt'' :: Num a => a -|> a
show'' :: Show a => a -|> String
abs'' = Kleisli $ /x -> do putStrLn ("Absolute of "++show x++"...")
return $ abs x
add2'' = Kleisli $ /x -> do putStrLn ("Add 2 to "++show x++"...")
return $ x + 2
sqrt'' = Kleisli $ /x -> do putStrLn ("Square root of "++show x++"...")
return $ sqrt x
show'' = Kleisli $ /x -> do putStrLn ("Show "++show x++"...")
return $ show x
Con eso, puedes definir
pipe'' :: Double -|> String
exactamente de la misma manera que antes, es decir
pipe'' = abs'' >>> add2'' >>> sqrt'' >>> show''
Pero ahora obtendrá los resultados intermedios impresos como un efecto secundario.
Estoy siguiendo este blog , para escribir un servidor http simple en haskell,
El uso de >>>
no está claro para mí. ¿Qué hace este fragmento de código?
handleHttpConnection r c = runKleisli
(receiveRequest >>> handleRequest r >>> handleResponse) c >>
close c
Similarmente en este enlace , estoy viendo <<<
let h = arr (++ "!")
<<< arr foo
<<< Kleisli bar
<<< arr id
¿Qué hace <<<
y >>>
hacer? ( El documento de Hackage es muy conciso y no se puede sacar mucho de él).