Javascript Ramda/Functional编程基础知识 有效的部分
我读了很多文章,看了一些关于JavaScript中FP的讨论,并决定试一试 我知道这是基本的东西,但再来一次?下面是: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
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]
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)
等价的结果。这比在有突变的情况下总是
要安全得多
当然,如果你做任何事都是一成不变的,那么恭喜你!我很想看到结果。请在每个问题贴上一个问题。