- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
>=) :: forall a b. m a -> (a -> m b) -> m b -6ren">
此代码中 forall
的用途是什么?
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
(没有错误)。
最佳答案
My background: I don't really understand forall or when Haskell has them implicitly.
好的,考虑 id
的类型, a -> a
。 a
是什么意思?意思是,它从哪里来?定义值时,不能只使用未在任何地方定义的任意变量。您需要一个顶级定义,或函数参数,或 where
条款,等等。一般来说,如果使用变量,it must be bound某处。
类型变量也是如此,forall
是绑定(bind)类型变量的一种方式。在任何地方,您看到未显式绑定(bind)的类型变量(例如,class Foo a where ...
在类定义中绑定(bind) a
),它由 forall
隐式绑定(bind)。 。
所以,id
的类型隐含地 forall a. a -> a
。这是什么意思?和它说的差不多。我们可以得到一个类型a -> a
对于所有可能的类型 a
,或者从另一个角度来看,如果您选择任何特定类型,您可以获得一个表示“从您选择的类型到其自身的函数”的类型。后一种措辞听起来有点像定义函数,因此您可以想到 forall
类似于类型的 lambda 抽象。
GHC 在编译期间使用各种中间表示,它应用的转换之一是使与函数的相似性更加直接:隐式 forall
是显式的,并且在任何将多态值用于特定类型的地方,它首先应用于类型参数。
我们甚至可以同时写 forall
s 和 lambda 作为一个表达式。我将暂时滥用符号并替换 forall a.
与 /\a =>
为了视觉一致性。在这种风格中,我们可以定义 id = /\a => \(x::a) -> (x::a)
或类似的东西。因此,像 id True
这样的表达式你的代码最终会被翻译成类似 id Bool True
的内容反而;只是id True
甚至不再有意义。
forall
s 始终是最外层,GHC 在使它们显式时可以选择它想要的任何顺序。在正常情况下,这显然并不重要。
我不确定这种情况下到底发生了什么,但根据评论,我猜测转换为使用显式类型参数以及 do
的脱糖。从某种意义上说,表示法彼此不知道,因此显式指定类型参数的顺序以确保一致性。毕竟,如果盲目地将两个类型参数应用于表达式,那么该表达式的类型是否为 forall a b. m a -> m b -> m b
就非常重要。或forall b a. m a -> m b -> m b
!
关于haskell - 这些显式的 "forall"在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519878/
我是一名优秀的程序员,十分优秀!