Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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 Ramda/Functional编程基础知识 有效的部分_Javascript_Typescript_Ramda.js - Fatal编程技术网

Javascript Ramda/Functional编程基础知识 有效的部分

Javascript Ramda/Functional编程基础知识 有效的部分,javascript,typescript,ramda.js,Javascript,Typescript,Ramda.js,我读了很多文章,看了一些关于JavaScript中FP的讨论,并决定试一试 我知道这是基本的东西,但再来一次?下面是: const easy=[ 0,0,4,6,7,2,0,0,0, 5,0,0,8,0,0,0,9,6, 0,6,3,0,4,0,0,0,8, 3,8,2,1,0,0,9,6,0, 4,7,5,0,0,0,1,0,0, 9,1,0,2,0,4,5,0,0, 0,0,0,0,0,0,0,2,9, 0,0,1,0,0,0,7,4,3, 2,0,0,0,6,3,8,0,1 ]; cons

我读了很多文章,看了一些关于JavaScript中FP的讨论,并决定试一试

我知道这是基本的东西,但再来一次?下面是:

const easy=[
0,0,4,6,7,2,0,0,0,
5,0,0,8,0,0,0,9,6,
0,6,3,0,4,0,0,0,8,
3,8,2,1,0,0,9,6,0,
4,7,5,0,0,0,1,0,0,
9,1,0,2,0,4,5,0,0,
0,0,0,0,0,0,0,2,9,
0,0,1,0,0,0,7,4,3,
2,0,0,0,6,3,8,0,1
];
const expandSudoku=R.map(
R.ifElse(
R等于(0),
R.always(R.range(1,10));
奥夫
)
);
log(expandSudoku(easy));
这将获取一个数字数组并将其映射到一个数组数组中

  • 0->[1,2,3,4,5,6,7,8,9]
  • n->[n]
R.equals使我困惑 因此,如果我错了,请纠正我的错误,但这实际上是相同的(对于一些匿名包装器函数):

const easy=[
0,0,4,6,7,2,0,0,0,
5,0,0,8,0,0,0,9,6,
0,6,3,0,4,0,0,0,8,
3,8,2,1,0,0,9,6,0,
4,7,5,0,0,0,1,0,0,
9,1,0,2,0,4,5,0,0,
0,0,0,0,0,0,0,2,9,
0,0,1,0,0,0,7,4,3,
2,0,0,0,6,3,8,0,1
];
const expandSudoku=R.map(v=>
R.ifElse(
x=>R.equals(0)(x),
x=>R.范围(1,10),
x=>R.of(x)
)(五)
);
log(expandSudoku(easy));
第一个问题:如果我将
R.equals(0)(x)
更改为
R.equals(0,x)
,为什么会出现错误?我认为拉姆达的咖喱风格应该是一样的。这只是打字稿吗?编译后的JavaScript运行良好

错误:类型为“(x:any)=>(a:any)=>boolean”的参数不能分配给类型为“Pred”的参数


通过第二个参数? 我有一个助手函数:

constpass2nd=R.curry((fn,arg1,arg2)=>fn(arg2))

我是这样用的:

const indextocord=R.applySpec({
x:R.模(R.uu9),
y:R.compose(数学、地板、R.divide(R.uuuuuuuu9))
});
const makeCell=R.applySpec({
coord:pass2nd(indextocord),//pass2nd只获取第二个参数
选项:R.unary(R.ifElse(//unary仅获取第一个参数
R等于(0),
R.始终(R.范围(1,10)),
奥夫
))
});
常量mapindex=R.addIndex(R.map);
const expandSudoku=mapIndexed(makeCell);
log(expandSudoku(easy));
拉姆达也有类似的东西吗?那是密码的味道吗?怎么了

最后: 什么时候作文太多了?是

const indextocord=R.applySpec({
x:R.模(R.uu9),
y:R.compose(数学、地板、R.divide(R.uuuuuuuu9))
});
通常比

const indextocord=v=>({
x:v%9,
y:数学楼层(v/9)
});
?

第一个问题:如果我将
R.equals(0)(x)
更改为
R.equals(0,x)
,为什么会出现错误?我认为拉姆达的咖喱风格应该是一样的。这只是打字稿吗?编译后的JavaScript运行良好

它们应该是相同的,如果JS运行良好,那么肯定是TS问题。恐怕我对TS的了解还不够,无法告诉您如何修复它

我有一个助手函数:

constpass2nd=R.curry((fn,arg1,arg2)=>fn(arg2));
[…]拉姆达也有类似的东西吗?那是密码的味道吗?怎么了

您可以以类似的方式使用。但我倾向于认为,如果我必须达到这一点,那么我会努力让分数不受限制,而这是不必要的。(与和其他一些Ramda函数类似。)

什么时候作文太多了?是

const indextocord=R.applySpec({
x:R.模(R.uu9),
y:R.compose(数学、地板、R.divide(R.uuuuuuuu9))
});
通常比

const indextocord=v=>({
x:v%9,
y:数学楼层(v/9)
});
?

我想说的恰恰相反。您的第二个函数非常可读。在我看来,使用无点样式的唯一重要原因是使代码更具可读性。这是不行的,我也不想麻烦了


还有一个警告。在这方面:

const expandSudoku=R.map(
R.ifElse(
R等于(0),
R.始终(R.范围(1,10)),
奥夫
)
)
始终使用
可能会有问题。这取决于您如何使用结果。但是很多数独系统使用了相当多的变异,以简化性能所需的操作。如果这样做,您应该知道,
总是
只返回提供的缓存值。它不是克隆人。如果您以这种方式使用它,并选择对结果数组进行变异,那么您将对替换的每个
0
进行变异

如果这是一个问题,可能会做出更好的选择:

const expandSudoku=R.map(
R.ifElse(
R等于(0),
R.thunkify(R.range)(1,10),
奥夫
)
)
基本上,
thunkifn(…args)
产生与
()=>fn(…args)
等价的结果。这比在有突变的情况下总是
要安全得多


当然,如果你做任何事都是一成不变的,那么恭喜你!我很想看到结果。

请在每个问题贴上一个问题。