最近,我决定从“房客”转到“兰达”,用功能性的方式来构成我的逻辑。我喜欢它!经过对FP的深入研究,我发现这不仅是关于方便的纯/无点实用程序(ramda),而且更多的是复杂的(至少对我来说)数学抽象(幻想-土地)。我不完全理解,但两者之一和任务模式看起来都非常方便。问题是,我不知道如何将其与ramda实用程序合并。我知道兰达-幻想,但它不再被维护。兰达-幻想建议图书馆的工作方式与拉姆达幻想不同。有了这些关于Monad/Monoids/函子类型的新信息,我完全迷失了方向。
例如,这方面的惯例是什么?
Right('boo')
.map(x => x + '!')
.map(x => x.toUpperCase())
vs
R.pipe(
R.map(x => x + '!')
R.map(x => x.toUpperCase())
)(Right('boo'))我是不是不需要兰达,如果我决定换到单簧管的话?
发布于 2021-07-16 13:15:58
考虑它的一种方法是考虑类型与函数。
Ramda提供了大量的实用函数集合。它们对数组、对象、函数、字符串、数字等进行操作,但也对用户定义的类型进行操作。因此,在您的示例中,R.map对任何与函子规格匹配的内容都进行操作。如果您使用的Either实现与该规范匹配,那么Ramda的map将对其进行操作。
但兰达不提供类型。它适用于内置类型,如对象、数组、函数等,但是--可以说是在Lens之外--它不提供自己的任何类型。像民间故事这样的库提供了大量的类型集合,比如Maybe、Result、Validation、Task和Future;更多的专用库(如Fluture )提供了一种特定类型(Future)的强大版本。所有这些类型都实现了函子规范。这类实现的一个非常不完整的列表是由FantasyLand提供。
这两个概念、抽象类型上的函数和类型集合是互补的。在任何函式上工作的Ramda函式将适用于您使用的任何版本的函式(只要它符合规范)。关于这种关系的更多信息是在这个StackOverflow Q+A中。
这个问题比较了这两个片段:
Right('boo')
.map(x => x + '!')
.map(x => x.toUpperCase())和
R.pipe(
R.map(x => x + '!')
R.map(x => x.toUpperCase())
)(Right('boo'))但我也不会从拉姆达的角度来看待这个问题。兰达是关于功能的。它提供函数,并希望您使用它们构建更复杂的函数,然后使用它们构建更高级别的函数。
如果我们编写了这个函数:
const bigBang = pipe(
map (x => x + '!'),
map (x => x .toUpperCase ())
)或者这个版本
const bigBang = pipe (
map (concat (__, '!')),
map (toUpper)
)那么这个函数现在可以在许多类型上使用。例如:
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提供了一些很好的方法来以通用的方式与它们进行互操作。
https://stackoverflow.com/questions/68402851
复制相似问题