当 运行 'sequence' 在 Eithers 列表中时,ghc 如何知道要列出哪个参数?

When running 'sequence' on a list of Eithers, how does ghc know which argument to list-ify?

我有两个函数,我对序列如何知道将哪个参数放入列表中以及 Either 中的 Lefts 实际发生了什么感到困惑

getMonStat :: T.Text -> IO (Either CmdError MonStat)
..
getMonStats :: [T.Text] -> IO (Either CmdError [MonStat])
getMonStats ms = do
  monStats <- mapM getMonStat ms
  pure $ sequence monStats

我的问题是:

  1. 为什么这样行得通?在 mapM 之后,我有 monStats :: [Either CmdError MonStat]。 运行 [m a] 上的序列将其变为 m [a]。为什么初始类型 [m a b] 不是因为 CmdError 也是一种类型?如果 CmdError 是要考虑的类型,ghc 怎么知道选择 MonStat 而不是 CmdError 来列表化?或类型:为什么序列转换为 m a b -> m a [b] 而不是 m a b -> m [a] b

  2. [Either CmdError MonStat] 的最后 Either CmdError [MonStat] 中的 CmdError 是哪一个?首先?所有这些的串联字符串?我可以测试,但我也很好奇为什么。

感谢您对此的任何见解

  1. 类型的应用程序也被柯里化了,它们关联到左边:[m a b] = [(m a) b] = [m' b] where m' = m a。所以它总是把最后一个参数带到“list-ify”。

  2. 取列表中第一个Left。这就是 EitherMonad 实例的定义方式:Left x >>= _ = Left xsequence 函数使用那个 Monad 实例。请参阅 关于收集所有失败的信息。