haskell - `>>=` 的目的更多是关于:根据参数处理不同的情况,还是解包参数?
问题描述
>>=
有类型 m a -> (a -> m b) -> m b
假设ma :: m a
和f :: a -> m b
。
更多关于的目的是>>= :: m a -> (a -> m b) -> m b
什么:
- 是否能够隐式解包以便
ma :: m a
适用于它?a
f :: a -> m b
或者能够根据不同的情况处理不同的情况
ma :: m a
?>>=
检查参数的许多实现,ma
以查看是否ma
满足某些条件。如果是,那么a <- ma; f a
。如果不是,那么用 做其他事情ma
,比如说g ma
, whereg :: m a -> m b
。一个更具体且仍然等效的版本>>=
是否有一个 typem a -> (a ->m b) -> (... -> m b) -> m b
, 像上面... -> m b
的第三个参数的类型在哪里?g
如果是,什么是 type...
?会m a
吗?可能不是a
,对吗?或两者?
谢谢。
解决方案
首先。的目的ma >>= k
是将函数k
应用于封装的a
值m
,以及它是如何执行的,涉及根据第一个参数处理不同的情况。
“曼陀罗”的ma >>= k = join (fmap k ma)
类型是
m a -- ma
a -> m b -- k
m (m b) -- after fmap
------------------
m b -- after join
k :: a -> m b
确实适用于a
"inside" m a
、 "under wraps"。
您提到的ma
价值检查是一个正交问题。如果m a
是 sum 类型,>>=
将检查并查看要处理的替代方案;处理的类型还是一样的m a
。例如,Nothing
仍然有 type Maybe a
,即使它没有特定的a
值“inside”。
Nothing
和情况都由Just x
相同<-
(或等效>>=
)处理,
do { a <- ma ; foo a } == ma >>= (\a -> foo a)
== (\case Nothing -> Nothing ;
Just a -> (\a -> foo a) a) ma
第二个选项的另一部分是对链接可能性的反思。
使用所谓的“Kleisli 组合”
(f >=> g) x = f x >>= g
我们可以链接“Kleisli 箭头”类型的函数,
f >=> g >=> ... >=> h
------------------------------------
a -> m b
b -> m c
......
s -> m t
------------------------------------
a -> m t
但两者>>=
都是>=>
二元运算符。当类型对齐时,可以将它们链接起来,形成n元操作链;但是基本的基本运算符是二元的。
这类似于列表,由二元运算符组成(:)
。
[a,b,c,...,n] = a : (b : (c : ... (n : []) ...))
推荐阅读
- java - 重写 txt 文件中的特定行
- javascript - React router v4 - Rendering two components on same route
- css - CSS visited, hover and active is not working
- visual-studio-code - VS Code Extension Host 运行的是旧版本的 Node.js
- python - How to use dictionary variables inside django static tag
- c - 如何解决这个意外的输出?
- html - HTML/SVG:当文件夹中的 SVG 文件时引用、使用和设置 SVG 样式
- azure - 如何将 azure 应用服务计划连接到 vnet,该 vnet 也通过对等连接到另一个 vnet
- python - 系统启动时的 SimpleHTTPServer
- css - 覆盖焦点上的“用户代理样式表”