如何阅读文字中的绑定运算符“>>=”?

How to read the bind operator ">>=" in words?

阅读代码时,我喜欢在脑海中形成句子。例如,x <- getChar 可能类似于 "x slurps getChar"。或者 a . b 将是 "b applied to a".

但是说到Monadic Bind运算符f >>= g,我只是在脑子里的句子中留下了一个心理空白,因为我不知道怎么读。 我想过 "f binds g",但感觉不对。你有什么建议?

提议的副本 link 包含一些对其他运算符非常好的答案,但对于绑定运算符,答案只是 "bind"。但是,"f bind g" 对我来说似乎没有意义。

>>= 其他语言类 monad 构造的名称:

  • 对于Java脚本promises,它是then。 (虽然不是完美对应,因为 then 做的事情更多。)
  • 对于JavaOptionals and Streams,是flatMap(它们是类似命名的函数,但它们不是来自同一个接口。)
  • 对于Java的CompletableFuture,是thenComposeAsync

>>=相当于先映射一个有效函数

fmap putStrLn getLine :: IO (IO ())

然后 "fusing" 类型构造函数的两个嵌套层 join :: Monad m => m (m a) -> m a:

join (fmap putStrLn getLine) :: IO ()

那么叫它"map 'n fuse"怎么样?

我建议从 'attach' 的意义上思考 'bind' 一词:将 g 绑定到 f 意味着 附加 单子动作 g 到单子 f。为了充实一点,将 f,一个 monad,想象成一个计算,当 运行 时,将 return 一些值(称这个值为 x)。将 monadic 动作 g 绑定到 monad f 表示一个新的计算,其中 monadic 动作 g 现在 附加 到 monad f,在某种意义上,一元计算 f 的结果 (x) 将作为参数传递给操作 g,而操作 return这是一个新的(单子)计算。

Elm 使用 andThen 相当于 >>=

makeThingA >>= (\a -> consumeThing a)

又名

makeThingA `andThen` (\a -> consumeThing a)