二维数组映射在点自由符号
Two dimensional array mapping in point free notation?
我正在玩函数式/隐性风格编程,特别是创建蛇游戏(游戏示例:http://patorjk.com/games/snake/)
具体的问题是,我取一个字符串数组,如:
[
['2 '],
['10']
]
,并希望获得按"值"的数字顺序排列的坐标列表。定义域中,0是蛇头,2是尾巴,整个就是棋盘。
所以我建了:
var findSnake = function(rendered_board) {
return r.map(function(x) {
return r.map(function (y) {
return {
x: x,
y: y,
val: rendered_board[x][y]
};
})(r.keys(r.split('', rendered_board[x])));
})(r.keys(rendered_board));
};
返回:
[ [ { x: '0', y: '0', val: '2' }, { x: '0', y: '1', val: ' ' } ],
[ { x: '1', y: '0', val: '1' }, { x: '1', y: '1', val: '0' } ] ]
然后我就可以排序,得到坐标列表。它可以工作,但我对风格有疑问。
是否有一种方法来写findSnake在点自由的风格?有没有更习惯的方法来解决这个问题?
正如预期的那样,这似乎很难转化为可读的无点解决方案。我确实取了它的一个更简单的子集,只是想看看我能做些什么,但它本身已经够丑了,我没有把它完成。
如果我们从这个函数开始:
var fn = function(list) {
return R.map(function(y) {
return {
y: y
};
}, list);
}
…可以清楚地看出这是原问题的内部子问题,然后,我可以把它变成这个怪物:
var fn = R.pipe(R.converge(
R.zip,
R.pipe(R.length, R.repeat('y')),
R.identity
), R.map(R.apply(R.createMapEntry)));
(一些中间步骤在REPL中)
但是考虑到它在es6中的样子,这似乎非常适得其反:
var fn = R.map(y => ({y});
这就是为什么我在有意义的时候使用无点,但不要试图在任何地方应用它。
在0.18版本中,Ramda将createMapEntry
重命名为objOf
,使converge
成为二进制函数,这意味着上面的代码不再工作。REPL链接也没有,因为REPL已经更新了。您可以在REPL中看到它的更新。
相关文章:
- 在.csv文件中写入学位符号
- Html画布自由转换
- 使用相同的数据集绘制各种符号
- 将带点符号的属性(有时)传递给函数
- RegEx JavaScript:数字后的符号提取
- 如何在计算器符号为零时替换它
- 删除输入中输入的符号
- 如何在ReactJs中渲染重音符号
- 如何替换JavaScript字符串中除字母和数字之外的所有内容(空格/符号)
- 插入符号到底是什么
- 删除图形和数字之间的连字符(-)符号
- 浏览器intl.NumberFormat未正确显示货币符号
- JS toLocaleString始终显示货币符号,而不考虑区域设置
- 将插入符号位置移动到ContentEditable<DIV>
- 为更改的输入返回插入符号位置的逻辑
- 包含转义符号的正则表达式
- Javascript中的符号
- 在slitify中制作二级项目符号的动画
- javascript美元符号变量不起作用
- 二维数组映射在点自由符号