当在一个列表上运行“序列”时,ghc 如何知道要列出哪个参数?

cra*_*bot 5 haskell ghc

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

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

我的问题是:

  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]将最后CmdErrorEither CmdError [MonStat]是什么?首先?所有这些的连接字符串?我可以测试,但我也很好奇为什么。

感谢您对此的任何见解

Nou*_*are 10

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

  2. 它需要Left列表中的第一个。这就是定义Monad实例的方式EitherLeft x >>= _ = Left x。该sequence函数使用该Monad实例。见这个问题如何收集的所有故障。