无点表示法中的二维数组映射?

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