二维数组映射在点自由符号

Two dimensional array mapping in point free notation?

本文关键字:自由 符号 映射 二维数组      更新时间:2023-09-26

我正在玩函数式/隐性风格编程,特别是创建蛇游戏(游戏示例: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中看到它的更新。