【问题标题】:Can't understand result of Monad >> application无法理解 Monad >> 应用程序的结果
【发布时间】:2016-07-25 16:45:24
【问题描述】:

操作>>说明如下:

依次组合两个动作,丢弃由 首先,像命令式中的排序运算符(例如分号) 语言。

这是一个让我困惑的例子:

> ([1] ++ [2]) >> ([2] ++ [3])
[2,3,2,3]

我期待列表 [2,3] 是表达式右侧的结果。 [2,3,2,3]的结果如何解释?

【问题讨论】:

  • (>>) 丢弃了 12,但这并不意味着 x >> y === y...
  • 通过更简单的示例,我得到了我的预期:[1] >> [2] 结果 [2]
  • 尝试不同类型的理解。例如。 [1,2] >> ['a']
  • @Scipio 我并没有说不可能找到xy 这样x >> y === y,只是这样的陈述并非对所有xy 都是正确的.
  • 就像@pdexter 说的那样,使用不同的值有助于理解下面的解释。例如。 this in ghci ([1,2] :: [Int]) >> ["a","b"] 给你 ["a","b","a","b"]

标签: haskell monads


【解决方案1】:

(>>) 默认定义为

a >> b = a >>= (\_ -> b)

所以被忽略的值是给定一元值m a 中的a。专门列出的>>= 的类型是:

(>>=) :: [a] -> (a -> [b]) -> [b]

l >>= f 为列表 l 的每个元素调用 f 以生成列表列表,然后将其连接起来。

例如

[1,2] >>= (\i -> [i, -i])
> [1,-1,2,-2]

忽略每个输入元素并返回值[2,3] 将导致列表[2,3] 的n 个副本用于长度为n 的输入列表

例如

[1] >>= (\_ -> [2,3])
> [2,3]

[1,2] >>= (\_ -> [2,3])
> [2,3,2,3]

第二个例子相当于你问题中的([1] ++ [2]) >> ([2] ++ [3])

【讨论】:

    【解决方案2】:

    Lee 回答的一个小补充:

    ([1] ++ [2]) >> ([2] ++ [3])
    

    等价于

    ([1] ++ [2]) >> ([2] ++ [3]) >>= \x -> return x
    

    相当于

    ([1] ++ [2]) >>= \y -> ([2] ++ [3]) >>= \x -> return x
    

    相当于

    [ x | y <- [1]++[2] , x <- [2]++[3] ]
    

    接近于命令式伪代码

    for y in [1]++[2]:
       for x in [2]++[3]:
          print x
    

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多