首页 > 解决方案 > `>>=` 的目的更多是关于:根据参数处理不同的情况,还是解包参数?

问题描述

>>=有类型 m a -> (a -> m b) -> m b

假设ma :: m af :: a -> m b

更多关于的目的是>>= :: m a -> (a -> m b) -> m b什么:

谢谢。

标签: haskellmonadsbinary-operators

解决方案


首先。的目的ma >>= k是将函数k应用于封装的am,以及它是如何执行的,涉及根据第一个参数处理不同的情况。

“曼陀罗”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 : []) ...))

推荐阅读