Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 有没有更好的方法以无点的方式撰写此文档?_Functional Programming - Fatal编程技术网

Functional programming 有没有更好的方法以无点的方式撰写此文档?

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

我一直在工作中遇到这个用例,我觉得必须有一种方法可以以无点的方式编写全名,而无需将cat定义为参数:

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提供一个特定的函数式编程库,并在一般概念中工作)

请注意,curred
prop
函数接受一个键并返回一个读卡器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
?您是否使用特定的库(或您自己的库)?通用版本,我将添加它们。这也非常有用,感谢您周到的回复!