首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解幻想世界‘`ap`’

理解幻想世界‘`ap`’
EN

Stack Overflow用户
提问于 2018-06-13 15:32:49
回答 1查看 319关注 0票数 0

我想了解一下ap,但遇到了麻烦。

幻想世界杂志上,詹姆斯·福布斯说:

首先,我们教函数如何与类型交互,方法是将该函数存储在容器中,就像任何其他值一样。(函数也是值,你知道的!)

代码语言:javascript
复制
var square = Type.of(
    a => a * a
)

//=> Type (number -> number)

然后,我们可以将包含的函数应用到包含的值中。

代码语言:javascript
复制
square.ap( Type.of(3) )

//=> Type(9)

ap对接收到的类型调用map,其本身作为转换函数。

代码语言:javascript
复制
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,这对我来说已经很容易理解了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-13 15:53:19

FantasyLand规范比詹姆斯·福布斯的文章早了三年,并且是由布莱恩·福布斯( Brian McKenna )创作的,所以詹姆斯·福布斯的文章似乎是基于规范,而不是反过来。

要回答您的问题,ab必须都是相同类型的“容器”。如果a是一个可能,那么b也一定是一个可能。如果a是一个任务,那么b也必须是一个任务。

这在FantasyLand规范中得到了说明:

B必须与a同样适用。

此外,其中之一必须包含一个函数作为其内部值。哪一个函数需要包含取决于API。在FantasyLand规范中,包含以下函数的是b

B必须是函数的应用程序。

在詹姆斯·福布斯的文章中,情况正好相反。我怀疑这是因为他的文章是以Ramda为基础的,而拉姆达的论点与你通常在JavaScript其他地方看到的不同。

在任何情况下,ap的结果都是具有与ab相同类型容器的值:

ap返回的应用程序必须与a和b相同。

结果包含了将包含的函数应用到另一个包含的值的结果。

因此,如果a是某个值Tx,b是一些值Tf,那么a.ap(b)就是T[f(x)]

希望这是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50841094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档