return在序列定义中的应用有多灵活?

How flexible are the applications of return in the definition of sequence?

sequence :: (Monad m) => [m a] -> m [a]
sequence []     = return []
sequence (x:xs) = x >>= \v -> sequence xs >>= \vs -> return (v:vs)

我有几个问题:

  1. m 是一个 Monad。但是,如果列表包含“不同种类”的 monad,即 Monad 类型的不同构造函数值怎么办?

  2. 可以调用哪个return?我不明白,因为我们至少有两种可能性:return 匹配 []return 匹配非空列表。

虽然 m 可以是任何具体的 monad,但一旦它专用于具体的 monad,所有出现都将是该具体类型。所以如果你有 [m a],那么列表中的所有值都必须专用于同一个具体的 monad。所以你的问题真的没有意义。

  1. 列表中的所有元素必须具有相同的类型,因此对于同一个 monad m.
  2. ,它们都是 m a 类型
  3. 由于所需的类型是 m [a],因此将使用 mreturn。如果使用列表 monad 的 returnreturn [] 将具有类型 [[]],这不是声明的结果,也不匹配第二种情况的类型。