Control.Category,>>> 和 <<< 是什么意思?
Control.Category, what does >>> and <<< mean?
我正在关注 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 and/or 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)
所以,<<<
和 >>>
只是组合函数,或者更一般地说 morphisms/arrows。
<<<
与熟悉的 .
的方向相同,而 >>>
翻转参数,以便“数据从左向右流动”。
现在,对于 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'
但是您现在会打印出中间结果作为副作用。
我正在关注 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 and/or 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)
所以,<<<
和 >>>
只是组合函数,或者更一般地说 morphisms/arrows。
<<<
与熟悉的 .
的方向相同,而 >>>
翻转参数,以便“数据从左向右流动”。
现在,对于 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'
但是您现在会打印出中间结果作为副作用。