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,所以我们所有的类型变量都有不同的名称。现在让我们介绍两个新的类型变量et,然后说d = e -> t。这使得id的类型:

id :: (e -> t) -> e -> t

现在,这符合liftA2a = e -> tb = ec = t的第一个参数类型。因此,对于这些分配,liftA2的类型变为:

liftA2 :: ((e -> t) -> e -> t) -> f (e -> t) -> f e -> f t

如果我们应用第一个参数,剩下的类型将变为f (e -> t) -> f e -> f t,这正是<*>的类型(模数重命名)。

以上是关于Haskell中()的默认定义如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vs Code 中更改默认自动选择的用户片段行为

这段混淆的 Haskell 代码是如何工作的?

如何在 Haskell 中连接幻像类型中的元组?

在 Haskell 中推导是如何工作的?

VBO/FBO/DisplayLists 如何在 Haskell 的 OpenGL 绑定中工作?

如何在 Haskell 中定义树状 DAG