Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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
Javascript 带有隐式Null的Ramda Curry_Javascript_Ramda.js - Fatal编程技术网

Javascript 带有隐式Null的Ramda Curry

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

我一直在努力学习Ramda库,学习函数式编程。这主要是学术性的,但我正在尝试创建一个很好的日志功能,我可以使用它从
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
,而是希望抛出一个错误。关于一致性,有很多话要说

我来这里是想知道是否有其他有趣的选择。我怎样才能转换