我们知道 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/