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

标签 haskell function-composition category-theory arrows category-abstractions

我关注 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 非常简洁,不能从中得到太多。)

最佳答案

正如 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表格,专门用于 哈斯克功能类别,
(.)   ::               (b->c) -> (a->b) -> (a->c)

所以,<<<>>>简单地组合函数,或更一般地说态射/箭头。
<<<组成方向与熟悉的. 相同, 而 >>>翻转参数,使“数据从左向右流动”。

现在,对于 以外的类别,箭头组合的含义是什么?哈斯克 ,当然取决于类别。 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'

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

关于haskell - Control.Category,>>>和<<<是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31228515/

相关文章:

`StateT a STM b` 中的 Haskell IO 操作

list - 检查2个列表是否有相等的元素 Haskell

python "multiple"组合/链表理解

haskell - 因子分解器的简单定义

haskell - 如何仅为 Floating 创建一个实例?

function - Haskell 中的泛型函数组合

function - fmap fmap如何应用于函数(作为参数)?

haskell - uncurry 和 fanin 在范畴论中是如何关联的?

haskell - 为什么在 Haskell 中偏爱幺半群而不是半群?为什么我们需要空?

haskell - 在 Haskell 中添加两个复数