【发布时间】:2014-07-06 03:12:22
【问题描述】:
深入思考这个计算中的类型,非常深入
id id
从右到左,第一个id有类型
a -> a
这意味着将第一个作为参数的第二个 id 必须具有类型
(a -> a) -> (a -> a)
类型不匹配!好吧,你可以说 first id 实际上有这个后来的类型,但是这会使 second id 成为类型
((a -> a) -> (a -> a)) -> ((a -> a) -> (a -> a))
我认为尽管函数可以具有泛型或变量类型,但函数在计算时会绑定到某些类型。在我看来,似乎每次调用都定义了一个 new id 函数。
【问题讨论】:
-
如果我们说
id :: a -> a,我们实际上是指id :: forall a. a -> a(implicit quantification)。(id :: forall a. a -> a) (id :: forall a. a -> a)中的a并不都指同一个类型。 -
如果你觉得这很有趣,你应该尝试将一堆
fmaps 放在ghci 中。例如。 ::t fmap fmap fmap fmap fmap返回:: Functor f => (a1 -> b) -> (a -> a1) -> f a -> f b
标签: haskell