我正在尝试理解适用的类型类,尤其是<*>
函数。现在,我看到它的类型签名是f (a -> b) -> f a -> f b
,并且我认为f
是函子,我认为这是一种包装一些数据的结构。在我看来f
必须处理通用类型,特别是f
必须具有参数化类型a
,b
,并且实际上它还必须支持a -> b
。 如果我的理解是正确的,那么我们正在做的工作是使用类型类f
,该类最初旨在包装一些数据,例如字符串列表或包含文件缓冲区的树或我们可能想要的任何随机对象。但是f
不能提交给任何一种类型,因为它不仅必须处理这种类型,而且还需要处理从数据到其他数据的函数。因此,如果我们有一个<*>
的示例实现,其中包含
Just2 f <*> j = fmap f j
读取方式是j
是Just2
内部的某种数据。 f
是将数据映射到数据的功能。 f
包裹在Just2
中。
这一切对吗?从根本上来说,我的问题是:所有适用性都必须如此泛泛,以至于它总是可以同时处理任意数据,并且还可以处理数据之间的数据吗?还是有某种方法可以使您拥有一个应用程序,使得它内部允许的唯一数据是列表?
我试图了解适用的类型类,尤其是功能。现在我看到它的类型签名是f(a-> b)-> f a-> f b,我认为f是一个函子,...
Functor
和Applicative
,您是正确的;他们需要能够处理任何类型的值。这称为parametric polymorphism
<*>
,例如一个名为Applicative
的,都具有功能Foo
的相关专业化,其类型签名为: