Javascript 没有部分应用的Curry函数?
下面是关于ReactJS中firebase身份验证的教程。在代码中,我偶然发现了这样的函数:Javascript 没有部分应用的Curry函数?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,下面是关于ReactJS中firebase身份验证的教程。在代码中,我偶然发现了这样的函数: const byPropKey = (propertyName, value) => () => ({ [propertyName]: value, }); {event => this.setState({ username: event.target.value })} 我想这个函数用于设置React组件的状态。它是这样使用的: <input value=
const byPropKey = (propertyName, value) => () => ({
[propertyName]: value,
});
{event => this.setState({ username: event.target.value })}
我想这个函数用于设置React组件的状态。它是这样使用的:
<input
value={username}
onChange={event => this.setState(byPropKey('username', event.target.value))}
type="text"
placeholder="Full Name"
/>
this.setState(byPropKey('username',event.target.value))}
type=“text”
占位符=“全名”
/>
我对React、JavaScript、ES6和函数式编程都是新手,所以这让我很困惑。我知道双箭头表示一个curried函数,它允许部分应用该函数。然而,在这种情况下,我看不出这在这种情况下是如何使用的
以下是我所指的教程:
您误解了双箭头。这只是创建了一个函数,不一定是一个curry或partial函数 例如:
//只是一个函数
让doSomething=()=>console.log(“做了某事”)
//叫它
doSomething()
函数用作映射状态的助手,并返回如下结果:
{ "statePiceName": value }
设定你的状态
没有此功能时的相同行为:
const byPropKey = (propertyName, value) => () => ({
[propertyName]: value,
});
{event => this.setState({ username: event.target.value })}
您也可以只console.log(byPropKey('key','customValue'))
并查看其工作原理
我看不出这在这种情况下是如何使用的
教程作者之所以使用该函数,是因为setState
。通过函数可以访问以前的状态和道具
在您提供的示例中,教程作者没有使用部分应用程序,因此没有利用对先前状态和道具的访问。因此,在这种特定的情况下,一个非通用的实现(将一个对象传递给setState)就可以了
但是,如果要添加到本教程的代码库中,未来的代码可能需要byPropKey
来访问prevState和props:
const byPropKey = (propertyName, value) => (prevState, props) => {
//... do something with prevState and props
return {
[propertyName]: value,
}
};
。。。这可能就是教程作者编写函数curry的原因。我将在20-30分钟内回答这个问题。这只是一个简单的类比,byPropKey返回一个返回对象的函数。setState需要一个函数作为返回对象的参数。这与函数式编程无关。或者咖喱。VTC不清楚。@Mark_M是的,但不清楚这是否与此处相关,或者OP到底混淆了什么。我仍然看不到任何与FP的关系,除了那个非常脆弱的关系。如果你想重新添加FP标记,我不会再删除它,这不值得争论。curry和partial application都是。我不认为在操作端有任何关于箭头函数概念的混淆。这肯定是一个curry函数,他/她知道使用arrow函数时需要的语法。@Andrew OP的代码中没有curry函数。@JaredSmith仔细查看。这是两个串联的箭头功能。使用该语法并尝试和
console.log
。只调用一次的东西d=()=>()=>console.log('d')
@Andrew我认为这是一个关于咖喱定义的语义论点。对我来说,你的例子只是一个高阶函数。咖喱涉及到驳斥论点。请看上面的编辑。@Mark\M现在我想起来了,我同意你的看法。我的错误。这确实回答了问题,但我还是有点困惑。首先,我如何调用这个函数?第二,为什么不改用未删节的形式呢?这似乎只会增加不必要的复杂性。