无点表示法中的二维数组映射?
Two dimensional array mapping in point free notation?
我正在玩 functional/tacit 风格的编程,特别是创建贪吃蛇游戏(游戏示例:http://patorjk.com/games/snake/)
具体的问题是我正在使用一个字符串数组,例如:
[
['2 '],
['10']
]
并希望获得 'value' 的数字顺序的坐标列表。在域中,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});
这就是为什么我在有意义的时候使用免积分,但不要试图在任何地方应用它。
更新
截至 version 0.18, Ramda renamed createMapEntry
to objOf
made converge
a binary function, which means the code above no longer works. Nor does the REPL link, as the REPL has been updated. You can see it now updated in the REPL。
我正在玩 functional/tacit 风格的编程,特别是创建贪吃蛇游戏(游戏示例:http://patorjk.com/games/snake/)
具体的问题是我正在使用一个字符串数组,例如:
[
['2 '],
['10']
]
并希望获得 'value' 的数字顺序的坐标列表。在域中,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});
这就是为什么我在有意义的时候使用免积分,但不要试图在任何地方应用它。
更新
截至 version 0.18, Ramda renamed createMapEntry
to objOf
made converge
a binary function, which means the code above no longer works. Nor does the REPL link, as the REPL has been updated. You can see it now updated in the REPL。