Haskell中()的默认定义如何工作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell中()的默认定义如何工作?相关的知识,希望对你有一定的参考价值。
在Haskell中,(<*>)
运算符的默认实现(它将函数a->b
应用于a
的应用程序,导致b
的应用)在Control.Applicative中定义为 -
(<*>) :: f (a -> b) -> f a -> f b
(<*>) = liftA2 id
而我根本无法理解它是如何工作的。
liftA2
的类型为liftA2 :: (a -> b -> c) -> f a -> f b -> f c
,意思是它需要一个二元函数,id
不是。根据我的理解,这意味着id
在某种程度上被解释为更复杂的类型 - 但我不确定它使这个定义起作用的方式或方式。如果有人可以解释id
被解释为什么类型(a
定义中的id :: a -> a
代表什么类型),并且还要介绍它如何产生一个函数,该函数采用函数的应用和值的应用并应用它们我将是非常感谢。
答案
假设id
的类型是d -> d
,所以我们所有的类型变量都有不同的名称。现在让我们介绍两个新的类型变量e
和t
,然后说d = e -> t
。这使得id
的类型:
id :: (e -> t) -> e -> t
现在,这符合liftA2
与a = e -> t
,b = e
和c = t
的第一个参数类型。因此,对于这些分配,liftA2
的类型变为:
liftA2 :: ((e -> t) -> e -> t) -> f (e -> t) -> f e -> f t
如果我们应用第一个参数,剩下的类型将变为f (e -> t) -> f e -> f t
,这正是<*>
的类型(模数重命名)。
以上是关于Haskell中()的默认定义如何工作?的主要内容,如果未能解决你的问题,请参考以下文章