haskell - 在 Haskell 中,当我们使用 do block 时,它如何确定要使用哪个 monad?

标签 haskell

我们知道 do block 只是语法糖。但是,它如何确定它在哪个单子(monad)上下文中呢?假设我们不使用 <- do block 中任何位置的运算符。

最佳答案

它使用相同的通用类型类机制来确定 +使用甚至是什么数字类型用于文字。那是,
就像是

 do
    return True

不会预测它应该使用的特定 monad,而只是分配类型 Monad m => m Bool .此约束表示 do-block 的类型为 m Bool对于任何 m恰好实现了 Monad类型类。此外,每当使用此 block 时,将从其使用的上下文中推断出特定的实例。

如果我们使用绑定(bind)到特定 Monad 的运算符,这将迫使类型变得更加具体。例如,如果我们使用 modify :: (a -> a) -> State s a -> State s () (为了示例,我正在简化类型)然后这将强制 block 具有类型 State s ... .一般来说,Haskell 会找出最通用的类​​型,并利用类型类约束来确保所讨论的类型实现了适当的操作。

关于haskell - 在 Haskell 中,当我们使用 do block 时,它如何确定要使用哪个 monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45300679/

相关文章:

haskell - Haskell 的有限域线性代数库

haskell - Applicative 的 ghci 特例?

haskell - 规范化函数而不在 Haskell 中实际应用它

Haskell - 无法将类型 ‘PersistEntityBackend record0’ 与 ‘SqlBackend’ 匹配

android - 在 Android 操作系统上运行 Haskell 程序

math - Haskell 中的求和符号

haskell - 将 Coq 提取到 Haskell

python - 有谁知道 TikZ 的非 TeX 等价物?

haskell - 部分应用与模式匹配 : why do these Haskell functions behave differently?

haskell - GADT 的详尽性检查失败