首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有FP类型的Ramda

有FP类型的Ramda
EN

Stack Overflow用户
提问于 2021-07-16 02:53:14
回答 1查看 282关注 0票数 5

最近,我决定从“房客”转到“兰达”,用功能性的方式来构成我的逻辑。我喜欢它!经过对FP的深入研究,我发现这不仅是关于方便的纯/无点实用程序(ramda),而且更多的是复杂的(至少对我来说)数学抽象(幻想-土地)。我不完全理解,但两者之一和任务模式看起来都非常方便。问题是,我不知道如何将其与ramda实用程序合并。我知道兰达-幻想,但它不再被维护。兰达-幻想建议图书馆的工作方式与拉姆达幻想不同。有了这些关于Monad/Monoids/函子类型的新信息,我完全迷失了方向。

例如,这方面的惯例是什么?

代码语言:javascript
复制
Right('boo')
  .map(x => x + '!')
  .map(x => x.toUpperCase())

vs 

R.pipe(
  R.map(x => x + '!')
  R.map(x => x.toUpperCase())
)(Right('boo'))

我是不是不需要兰达,如果我决定换到单簧管的话?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-16 13:15:58

考虑它的一种方法是考虑类型与函数。

Ramda提供了大量的实用函数集合。它们对数组、对象、函数、字符串、数字等进行操作,但也对用户定义的类型进行操作。因此,在您的示例中,R.map对任何与函子规格匹配的内容都进行操作。如果您使用的Either实现与该规范匹配,那么Ramda的map将对其进行操作。

但兰达不提供类型。它适用于内置类型,如对象、数组、函数等,但是--可以说是在Lens之外--它不提供自己的任何类型。像民间故事这样的库提供了大量的类型集合,比如MaybeResultValidationTaskFuture;更多的专用库(如Fluture )提供了一种特定类型(Future)的强大版本。所有这些类型都实现了函子规范。这类实现的一个非常不完整的列表是由FantasyLand提供

这两个概念、抽象类型上的函数和类型集合是互补的。在任何函式上工作的Ramda函式将适用于您使用的任何版本的函式(只要它符合规范)。关于这种关系的更多信息是在这个StackOverflow Q+A中。

这个问题比较了这两个片段:

代码语言:javascript
复制
Right('boo')
  .map(x => x + '!')
  .map(x => x.toUpperCase())

代码语言:javascript
复制
R.pipe(
  R.map(x => x + '!')
  R.map(x => x.toUpperCase())
)(Right('boo'))

但我也不会从拉姆达的角度来看待这个问题。兰达是关于功能的。它提供函数,并希望您使用它们构建更复杂的函数,然后使用它们构建更高级别的函数。

如果我们编写了这个函数:

代码语言:javascript
复制
const bigBang = pipe(
  map (x => x + '!'),
  map (x => x .toUpperCase ())
)

或者这个版本

代码语言:javascript
复制
const bigBang = pipe (
  map (concat (__, '!')),
  map (toUpper)
)

那么这个函数现在可以在许多类型上使用。例如:

代码语言:javascript
复制
bigBang (['boo', 'scared', 'you'])     //=> ['BOO!', 'SCARED!', 'YOU!']
bigBang ({a: 'boo', b: 'ya'})          //=> {a: 'BOO!', b: 'YA!}
bigBang ((s) => s .repeat (2)) ('boo') //=> 'BOOBOO!'
bigBang (Right ('boo'))                //=> Right ('BOO!') 
bigBang (Left ('oops'))                //=> Left ('oops') 
bigBang (Just ('boo'))                 //=> Just ('BOO!') 
bigBang (Nothing())                    //=> Nothing ()
bigBang (Future ('boo'))               //=> Future ('BOO!')

前三个-- Array、Object和Function实现--由Ramda提供。但是,由于Ramda与FantasyLand函子规范互操作,其他功能仍然有效。如果您在您的类型上提供自己的map方法(或者更好的是fantasy-land/map方法),它就能工作。

所以不,您不需要Ramda处理Monad或其他抽象类型。您可以直接使用它们的实现。但是Ramda提供了一些很好的方法来以通用的方式与它们进行互操作。

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

https://stackoverflow.com/questions/68402851

复制
相关文章

相似问题

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