【问题标题】:How does this simple chained binding works?这个简单的链式绑定是如何工作的?
【发布时间】:2014-10-15 01:32:44
【问题描述】:

我在 Haskell 中学习 Monads,我正在分析这个例子 (http://learnyouahaskell.com/a-fistful-of-monads):

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)

我想了解这部分函数发生了什么:

\n -> ['a','b'] >>= \ch -> return (n,ch)

我的理解是\ch -> return (n,ch) 是由\n -> ['a','b'] 作为参数组成的,但我不确定这是怎么发生的。我在想它有以下组合功能:

[1,2] >>= \n -> [n, \n -> ['a','b']]

但这似乎与执行完整表达式的结果不同。

编辑 1:

考虑到完整括号下方的答案是:

[1,2] >>= ( \n -> ( ['a','b'] >>= \c -> return (n,c) ) )

这导致我获得了这个组合功能:

[1,2] >>= ( \n -> [(n,'a'),(n,'b')] )

【问题讨论】:

  • 小心“部分评估”这个词。这是一个与这里发生的任何事情无关的技术术语。 (这是一种优化技术。)
  • 将术语更正为我认为正确反映行为的术语。

标签: haskell monads


【解决方案1】:

实际上和那有点不同。括号如下

[1,2] >>= (\n -> ['a','b'] >>= (\ch -> return (n,ch)))

或者,如果你愿意的话

let step1 n = 
  let step2 ch = return (n, ch)
  in ['a','b'] >>= step2
in [1,2] >>= step1

【讨论】:

  • 好的。现在我看到完整的括号是:[1,2] >>= ( \n -> ( ['a','b'] >>= \c -> return (n,c) ) )。但是,如果我尝试部分组合它,我想我会得到:[1,2] >>= ( \n -> [(n,['a','b'])] ),但这似乎没有意义。你能发布评估是如何进行的吗?我的意思是对所发生的步骤进行简单列举。
  • 诀窍是这样的部分合成必须通过“从外部剥离层”来完成。 monadic 绑定序列中的后面步骤本身都有意义,但前面的步骤没有......至少,除非你用return 填补这个洞。
  • 在上面的第二个sn-p中,step2中的n实际上是未绑定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2021-02-26
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多