【发布时间】:2019-08-15 22:32:48
【问题描述】:
为什么这段代码会编译?
--sequence_mine :: Monad m => [m a] -> m [a]
sequence_mine [] = return []
sequence_mine (elt:l) = do
e <- elt
sl <- sequence l
return (e:sl)
注意,我故意在这里注释掉了类型声明。但是即使没有类型声明,代码仍然可以编译并且似乎可以按预期工作 - 这让我感到惊讶。
据我了解,这行应该有歧义:
return (e:sl)
原因是 Haskell 不应该知道我们返回的是哪种类型的 monad。为什么它必须与我们接受的类型相同?
澄清更多。据我了解,如果我没有明确地将类型声明类似于我注释掉的那个,Haskell 应该推断出这个函数有这样的类型:
sequence_mine :: (Monad m1, Monad m2) => [m1 a] -> m2 [a]
除非我明确地将m1 和m2 统一为m,否则Haskell 没有理由相信它们都指的是同一类型!我想。
然而事实并非如此。我在这里错过了什么?
【问题讨论】:
标签: function haskell types monads