【发布时间】:2012-09-13 05:56:26
【问题描述】:
这段代码中foralls 的用途是什么?
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
-- Explicit for-alls so that we know what order to
-- give type arguments when desugaring
(省略了一些代码)。这是来自Monads 的代码。
我的背景:我不太了解 forall 或 Haskell 何时隐含它们。
此外,它可能并不重要,但 GHCi 允许我在给 >> 一个类型时省略 forall:
Prelude> :t (>>) :: Monad m => m a -> m b -> m b
(>>) :: Monad m => m a -> m b -> m b
:: (Monad m) => m a -> m b -> m b
(没有错误)。
【问题讨论】:
-
@sacundim 不同意;问题不在于
forall通常做什么,或者更高级别的类型是什么。问题在于,具体而言,forall在这段代码中做了什么,根据它后面的注释。 -
这是一个 ExplicitForall 的例子。它们不是更高等级的类型,移除foralls 不会改变类型。我不确定为什么它们在这里是一个优势。该评论表明它有助于编译器在脱糖阶段。
-
Matt S 是对的,这些正是语言隐含指定的 foralls,因此从语义上讲,它们的缺席或存在不会改变任何事情。然而,我不知道编译器在脱糖阶段对它们的存在有何用途。
标签: haskell higher-rank-types forall