Haskell 控件。类别,什么是>&燃气轮机&燃气轮机;及<<&书信电报;什么意思?

Haskell 控件。类别,什么是>&燃气轮机&燃气轮机;及<<&书信电报;什么意思?,haskell,function-composition,category-theory,arrows,category-abstractions,Haskell,Function Composition,Category Theory,Arrows,Category Abstractions,下面我要用haskell编写一个简单的http服务器 我不清楚>>的用法。这个代码段是做什么的 handleHttpConnection r c = runKleisli (receiveRequest >>> handleRequest r >>> handleResponse) c >> close c 同样地,我看到的是黑客和/或胡格尔会告诉你的 (>>>) :: Category k => a`k`

下面我要用haskell编写一个简单的http服务器

我不清楚
>>
的用法。这个代码段是做什么的

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

同样地,我看到的是黑客和/或胡格尔会告诉你的

(>>>) :: Category k => a`k`b  -> b`k`c  -> a`k`c
(<<<) :: Category k => b`k`c  -> a`k`b  -> a`k`c
或者,以其
前奏
形式,专门用于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'

但是你现在会得到作为副作用打印出来的中间结果。

该博客有一篇关于Kleisli Arrows的文章,似乎很有用。我相信这两个操作符代表了某种函数组合(箭头是函数)。对于其他类型的箭,我不确定,因为箭对我来说有点奇怪。这是一个很好的例子。。。谢谢为什么会有人做
秀。sqrt。(+2) . abs
而不是
显示$sqrt$(+2)$abs n
。我知道,dot
是关于一些函数组合的,但是它解决了
$
不能解决的任何问题吗?@MadhavanKumar:事实上,这是
$
不能解决的问题的一个很好的例子:它不能推广到任意类别。(.)除此之外,无点样式通常更简洁,可以更容易地重构,并且不需要引入变量名。。。然而,这些并不总是优势;有时无点代码更难理解(“无意义的代码”)。那么,
是否也是适用于monad的
的特殊情况?我编写了与您的示例类似的代码,但在applicative中使用了
,这是applicative for函数(composition)的组成部分对于我感兴趣的效果(登录到您的示例中),即Compose(a->)(Reader…)。也许你是cleaner@imz--IvanZakharyaschev:是的,我想是的,只是
=>
不需要
Kleisli
一元函数的新类型包装器。
pipe' :: Double -|> String
pipe' = abs' >>> add2' >>> sqrt' >>> show'