无法使用ramda的R.cond读取null的属性“长度”

时间:2018-08-30 01:34:38

标签: functional-programming ramda.js

这是2条未注释的方法,一种有效,而第二种使用ramdajs的方法无效:

    // const dies = col && 2 > count > 3
    // const lives =
    //  (col && (count === 2 || count === 3)) || (!col && count === 3)

    // return dies ? null : lives ? true : null

    const result = (_col, _count) =>
        R.cond([
            [_col && (_count === 2 || _count === 3), true],
            [!_col && _count === 3, true],
            [_col && 2 > _count > 3, null],
            [R.T, null]
        ])

    return result(col, count)

我收到一个错误Cannot read property 'length' of null

1 个答案:

答案 0 :(得分:2)

在我看来,您正在尝试直接编写Game of Life规则。

我认为类似的方法会很好:

const nextGeneration = (col, count) => count == 3 || (col && count == 2)

这将返回一个布尔值,而不是您的true | null。这让我感到更干净,但是如果您想要null,只需在末尾添加|| null

这不使用Ramda。我在这里没有理由这样做(免责声明:我是Ramda的作者。)但是,如果您愿意,我敢肯定我们可以将其转换为Ramda的一些免分版本,但它的可读性可能会大大降低。 / p>

顺便说一句,您的任何版本似乎都出了问题。 2 > count > 3应该是什么意思?即使它确实在JS中扩展为2 > count && count > 3,但实际上并非如此,因为2 <3,所以这永远都是不正确的。