haskell - 当在一个列表上运行 'sequence' 时,ghc 如何知道 list-ify 是哪个参数?

标签 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
我的问题是:
  • 为什么这样做?在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 ?
  • 哪个离开了[Either CmdError MonStat]会最终CmdErrorEither CmdError [MonStat]是?首先?所有这些的连接字符串?我可以测试,但我也很好奇为什么。

  • 感谢您对此的任何见解

    最佳答案

  • 类型应用程序也是柯里化(Currying)的,它们关联到左边:[m a b] = [(m a) b] = [m' b]哪里m' = m a .所以它总是采用“list-ify”的最后一个参数。
  • 它需要第一个 Left在列表中。 Monad就是这样的Either 的实例定义为:Left x >>= _ = Left x . sequence函数使用该 Monad实例。见 this question关于收集所有失败。
  • 关于haskell - 当在一个列表上运行 'sequence' 时,ghc 如何知道 list-ify 是哪个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68165537/

    相关文章:

    haskell - 如何从列表中获取第 n 个元素?

    haskell - F# 歧视联合中的函数

    haskell - 为什么堆栈不将包添加到 ghc 包数据库?

    haskell - GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    algorithm - 欧几里得算法使用 until

    haskell - 如何将 Maybe 值注入(inject) MaybeT

    haskell - 在 Haskell 中导入时隐藏类型类实例声明

    haskell - GHC 类型家族是系统 F-omega 的一个例子吗?

    performance - 调试 GHC 的约束求解器导致的编译时性能问题

    haskell - 将文字分配给 GHC 中的术语