Functional programming 有没有更好的方法以无点的方式撰写此文档?
我一直在工作中遇到这个用例,我觉得必须有一种方法可以以无点的方式编写全名,而无需将cat定义为参数:Functional programming 有没有更好的方法以无点的方式撰写此文档?,functional-programming,Functional Programming,我一直在工作中遇到这个用例,我觉得必须有一种方法可以以无点的方式编写全名,而无需将cat定义为参数: const cat=[ {name:'Bob',lastName:'Ross'}, {姓名:'Frank',姓氏:'Langella'}, ]; //这让我讨厌 const fullName=cat=>add( 道具(“名称”,猫), 道具('lastName',cat) ); 常量相等=咖喱((a,b)=>a==b); const isBobRoss=compose(isEqual('BobR
const cat=[
{name:'Bob',lastName:'Ross'},
{姓名:'Frank',姓氏:'Langella'},
];
//这让我讨厌
const fullName=cat=>add(
道具(“名称”,猫),
道具('lastName',cat)
);
常量相等=咖喱((a,b)=>a==b);
const isBobRoss=compose(isEqual('BobRoss'),全名);
编辑:上面的一些帮助,以防它有助于理解挑战
/**
*组合::((a->b),(b->c),…,(y->z))->a->z
*/
常量组合=(…fns)=>(…args)=>
fns.reduceRight((res,fn)=>[fn.call(null,…res)],args[0];
/**
*咖喱::((a,b,…)->c)->a->b->…->C
*/
功能咖喱(fn){
常数=fn.长度;
返回函数$curry(…args){
if(参数长度<算术){
返回$curry.bind(null,…args);
}
返回fn.call(null,…args);
};
/**
*添加::a->b->a+b
*/
常量添加=咖喱((x,y)=>x+y)
/**
*prop::String->Object->a
*/
常量属性=咖喱((p,obj)=>obj[p])
}
这不是确切的函数组合,但请确保您可以为其编写帮助函数,下面是它的简化(一元)版本:
const converge = (fn, wraps) => arg => fn(...wraps.map(wrap => wrap(arg)));
cost fullName = converge(add, [prop('name'), prop('lastName')]);
(起初,我拒绝为JS/TS提供一个特定的函数式编程库,并在一般概念中工作)
请注意,curredprop
函数接受一个键并返回一个读卡器monad。这将是有用的
假设typeobj={name:string,lastName:string}
,那么您当前的属性fn是(key:'name'|'lastName')=>Reader
您可以使用sequence
type函数将两个读卡器单子组合成一个,如下所示:
const getNameParts=sequence(prop('name')、prop('lastName'))//读取器
然后您可以将[string,string]映射为单个字符串,就像在add函数中一样
const add=as=>as.reduce((会计科目,项目)=>acc+项目)
因此,如果您可以将添加到阅读器monad的计算上下文中(这里使用一个建议的`映射:((a:a)=>B)=>(fa:F)=>F),然后编写以下操作:
const buildNameFromObject=compose(getNameParts,map(add))//阅读器
好了
const personsName=buildNameFromObject(someObject)//字符串
fp-ts
是一个库,它提供了我刚才提到的所有内容,并使用该库(通过一些函数名更改来与fp-ts的词汇表保持一致)
从'fp ts/lib/reader'导入{reader,map}
从'fp ts/lib/Apply'导入{sequenceT}
从“fp ts/lib/pipeable”导入{pipe}
const getNameParts=sequenceT(读取器)(prop('name')、prop('lastName'))
const buildNameFromObject=pipe(getNameParts,map(add))//Reader,这是一种奇特的编写方式(o:Obj)=>string
buildNameFromObject({name:'Foo',lastName:'Bar'})/'FooBar'
您的“全名”功能(buildNameFromObject
)现在是无点的。什么是add
,prop
,curry
和compose
?您是否使用特定的库(或您自己的库)?通用版本,我将添加它们。这也非常有用,感谢您周到的回复!