我想了解一下ap,但遇到了麻烦。
在幻想世界杂志上,詹姆斯·福布斯说:
首先,我们教函数如何与类型交互,方法是将该函数存储在容器中,就像任何其他值一样。(函数也是值,你知道的!)
var square = Type.of(
a => a * a
)
//=> Type (number -> number)然后,我们可以将包含的函数应用到包含的值中。
square.ap( Type.of(3) )
//=> Type(9)
ap对接收到的类型调用map,其本身作为转换函数。
function ap(type){
// recall our value
// is a function
// Type ( a -> a )
var transformer = this.__value
return type.map(transformer)
}因此,看起来只有当容器中的值是一个函数时,ap才能工作。这对我来说已经很奇怪了,因为我认为完美API的全部意义在于,这些函数每次都适用于任何事情。
我还想注意一下,因为行square.ap(Type.of(3) ),在我看来,ap需要任何函子(map的实现者)。
现在,如果我跳到javascript幻想-土地规范,我认为它是基于James链接的,ap签名(a.ap(b))的1.i定义是这样的
如果
b不表示函数,则未指定ap的行为。
因此,听起来这个规范要求ap接受一个与完美API不同的函数。
总之,我想我不了解ap的规范或它的实现方式。当我尝试在谷歌上搜索时,似乎大多数人只是想谈论map,这对我来说已经很容易理解了。
发布于 2018-06-13 15:53:19
FantasyLand规范比詹姆斯·福布斯的文章早了三年,并且是由布莱恩·福布斯( Brian McKenna )创作的,所以詹姆斯·福布斯的文章似乎是基于规范,而不是反过来。
要回答您的问题,a和b必须都是相同类型的“容器”。如果a是一个可能,那么b也一定是一个可能。如果a是一个任务,那么b也必须是一个任务。
这在FantasyLand规范中得到了说明:
B必须与a同样适用。
此外,其中之一必须包含一个函数作为其内部值。哪一个函数需要包含取决于API。在FantasyLand规范中,包含以下函数的是b:
B必须是函数的应用程序。
在詹姆斯·福布斯的文章中,情况正好相反。我怀疑这是因为他的文章是以Ramda为基础的,而拉姆达的论点与你通常在JavaScript其他地方看到的不同。
在任何情况下,ap的结果都是具有与a和b相同类型容器的值:
ap返回的应用程序必须与a和b相同。
结果包含了将包含的函数应用到另一个包含的值的结果。
因此,如果a是某个值Tx,b是一些值Tf,那么a.ap(b)就是T[f(x)]。
希望这是有意义的。
https://stackoverflow.com/questions/50841094
复制相似问题