Control.Category,>>>是什么和<<<意思?

时间:2015-07-05 08:31:24

标签: haskell function-composition arrows category-theory

我正在关注this blog,在haskell中编写一个简单的http服务器,

我不清楚>>>的使用情况。这段代码片段做了什么?

handleHttpConnection r c = runKleisli
    (receiveRequest >>> handleRequest r >>> handleResponse) c >>
    close c

this link上的相似内容,我看到了<<<

let h =     arr (++ "!")
          <<< arr foo
          <<< Kleisli bar
          <<< arr id

<<<>>>做了什么? (Hackage document非常简洁,无法从中得到很多。)

1 个答案:

答案 0 :(得分:21)

正如Hackage和/或Hoogle会告诉你的那样,

(>>>) :: Category k => a`k`b  -> b`k`c  -> a`k`c
(<<<) :: Category k => b`k`c  -> a`k`b  -> a`k`c

观察后者实际上与

相同
(.)   :: Category k => b`k`c  -> a`k`b  -> a`k`c

或以其Prelude形式专门针对 Hask 类别的函数,

(.)   ::               (b->c) -> (a->b) -> (a->c)

所以,<<<>>>只是组成函数,或者更常见的是态射/箭头。

<<<的编写方向与熟悉的.相同,而>>>会翻转参数,以便“数据从左向右流动”。

现在,对于 Hask 以外的类别,的含义意味着,当然取决于类别。 Kleisli IO是一个易于理解的例子:说我们有一个纯函数

pipe :: Double -> String
pipe = show . sqrt . (+2) . abs

正如我所说,这也可以写成

pipe = abs >>> (+2) >>> sqrt >>> show

现在,如果您想添加原始IO日志记录(就像您可能使用命令式语言),您可以介绍

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

有了它,你可以定义

pipe' :: Double -|> String
完全与以前相同,即

pipe' = abs' >>> add2' >>> sqrt' >>> show'

但是你现在将中间结果作为副作用打印出来。