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)
我有几个问题:
m
是一个 Monad
。但是,如果列表包含“不同种类”的 monad,即 Monad
类型的不同构造函数值怎么办?
可以调用哪个return
?我不明白,因为我们至少有两种可能性:return
匹配 []
和 return
匹配非空列表。
虽然 m
可以是任何具体的 monad,但一旦它专用于具体的 monad,所有出现都将是该具体类型。所以如果你有 [m a]
,那么列表中的所有值都必须专用于同一个具体的 monad。所以你的问题真的没有意义。
- 列表中的所有元素必须具有相同的类型,因此对于同一个 monad
m
. ,它们都是 m a
类型
- 由于所需的类型是
m [a]
,因此将使用 m
的 return
。如果使用列表 monad 的 return
,return []
将具有类型 [[]]
,这不是声明的结果,也不匹配第二种情况的类型。
sequence :: (Monad m) => [m a] -> m [a]
sequence [] = return []
sequence (x:xs) = x >>= \v -> sequence xs >>= \vs -> return (v:vs)
我有几个问题:
m
是一个Monad
。但是,如果列表包含“不同种类”的 monad,即Monad
类型的不同构造函数值怎么办?可以调用哪个
return
?我不明白,因为我们至少有两种可能性:return
匹配[]
和return
匹配非空列表。
虽然 m
可以是任何具体的 monad,但一旦它专用于具体的 monad,所有出现都将是该具体类型。所以如果你有 [m a]
,那么列表中的所有值都必须专用于同一个具体的 monad。所以你的问题真的没有意义。
- 列表中的所有元素必须具有相同的类型,因此对于同一个 monad
m
. ,它们都是 - 由于所需的类型是
m [a]
,因此将使用m
的return
。如果使用列表 monad 的return
,return []
将具有类型[[]]
,这不是声明的结果,也不匹配第二种情况的类型。
m a
类型