Javascript 带有隐式Null的Ramda Curry
我一直在努力学习Ramda库,学习函数式编程。这主要是学术性的,但我正在尝试创建一个很好的日志功能,我可以使用它从Javascript 带有隐式Null的Ramda Curry,javascript,ramda.js,Javascript,Ramda.js,我一直在努力学习Ramda库,学习函数式编程。这主要是学术性的,但我正在尝试创建一个很好的日志功能,我可以使用它从pipe或compose 我注意到的事情 使用Ramda实现函数后,调用不带任何参数的函数将返回相同的函数 f()返回f 但是 f(未定义)和f(空) 不要这样做。 我已经创建了一个实用程序函数,它将这些调用对齐,以便 f() //如果x是函数,则返回true 常量isFunction=x=> Object.prototype.toString.call(x)='[Object F
pipe
或compose
我注意到的事情
使用Ramda实现函数后,调用不带任何参数的函数将返回相同的函数
f()
返回f
但是
f(未定义)
和f(空)
不要这样做。
我已经创建了一个实用程序函数,它将这些调用对齐,以便
f()
//如果x是函数,则返回true
常量isFunction=x=>
Object.prototype.toString.call(x)='[Object Function]';
//转换当前函数,使其始终至少包含一个参数
const neverZeroArgs=fn=>(…args)=>{
让ret=args.length>0?
fn(…args):
fn(空)
返回isFunction(ret)?
neverZeroArgs(ret):
ret
}
const minNullCurry=compose(neverZeroArgs,curry);
现在正在使用:
const logMsg=minNullCurry((msg,val)=>{
if(isNil(msg)| msg.length<1)console.log(val);
else if(isNil(val))console.log(msg);
else console.log(`${msg}:`,val);
});
const logwithout msg=logMsg();
logwithout msg({Arrr:“Matey”})
如果我想在Ramda管道或合成中使用它,我可以这样做:
//与logMsg相同,但始终返回给定的值
const tapLog=管道(logMsg,tap);
烟斗(
道具(“长度”),
tapLog()/->“5”
)([1,2,3,4,5]);
烟斗(
道具(“长度”),
tapLog('I have a thing of length')/>“I have a thing:5”
)([1,2,3,4,5]);
烟斗(
始终(空),
tapLog(“测试”)/->“测试”
)([1,2,3,4,5]);
我刚刚开始使用Ramda,我想知道它是否附带了任何可能使这更容易/更干净的东西。我确实意识到我可以这样做:
const logMsg=msg=>val=>{
if(isNil(msg))console.log(val);
else if(isNil(val))console.log(msg);
else console.log(`${msg}:`,val);
});
我已经完成了,但现在我必须永远一次应用一个参数
这很好,但我来这里是想知道是否有其他有趣的选择。如何转换当前函数,使f()
返回f(null)
,或者这样做是一种代码味道?(这里是Ramda创始人和维护者)
使用Ramda实现函数后,调用不带任何参数的函数将返回相同的函数
f()
返回f
但是
f(未定义)
和f(空)
不要这样做。
确实如此。这是故意的。在Ramda中,对于i
,其中n
是函数长度,使用i
参数调用函数,然后使用j
参数调用函数,其行为应该与我们最初使用i+j
参数调用函数的行为相同。如果i
为零,则没有例外。关于这一点,多年来一直存在一些争议。另一位联合创始人不同意我的观点,但我们的第三位合作者同意我的观点,从那以后就一直如此。请注意,另一位创始人不希望将其视为您提供了undefined
/null
,而是希望抛出一个错误。关于一致性,有很多话要说
我来这里是想知道是否有其他有趣的选择。我如何转换一个curried函数,使f()返回f(null),或者它是一种代码味道,甚至想这样做
这不是一种代码气味,一点也不是。Ramda不会提供给您,而且可能永远也不会提供,因为它与库的其他部分并不匹配。Ramda需要能够区分空呼叫和输入为零的呼叫,因为对于某些用户来说,这可能很重要。但是从来没有人说过你所有的合成工具都必须来自一个特定的库
我看你所做的没有错
如果您对另一个API感兴趣,那么下面的内容可能会很有趣:
const{pipe,prop,always}=R
const tapLog=Object.assign(
(…val)=>console.log(…val)| val,
{
msg:(msg)=>(…val)=>console.log(`${msg}:`,…val)| val,
val:(…val)=>console.log(…val)|_
}
)
tapLog({Arrr:“Matey”})
烟斗(
道具(“长度”),
tapLog/->“5”
)([1,2,3,4,5]);
烟斗(
道具(“长度”),
tapLog.msg('I have a thing of length')/>“I have a thing of length:5”
)([1,2,3,4,5]);
烟斗(
始终(空),
tapLog.val('test')/->“test”
)([1,2,3,4,5]);代码>
(这里是拉姆达的创始人和维护者)
使用Ramda实现函数后,调用不带任何参数的函数将返回相同的函数
f()
返回f
但是
f(未定义)
和f(空)
不要这样做。
确实如此。这是故意的。在Ramda中,对于i
,其中n
是函数长度,使用i
参数调用函数,然后使用j
参数调用函数,其行为应该与我们最初使用i+j
参数调用函数的行为相同。如果i
为零,则没有例外。关于这一点,多年来一直存在一些争议。另一位联合创始人不同意我的观点,但我们的第三位合作者同意我的观点,从那以后就一直如此。请注意,另一位创始人不希望将其视为您提供了undefined
/null
,而是希望抛出一个错误。关于一致性,有很多话要说
我来这里是想知道是否有其他有趣的选择。我怎样才能转换