考虑下面的工作代码:
var randN = x => () => Math.floor(x*Math.random());
var rand10 = randN(10)
times(rand10, 10) // => [6, 3, 7, 0, 9, 1, 7, 2, 6, 0]
randN
是一个函数,它接受一个数字并返回一个 RNG,当被调用时,它将返回一个范围为 [0, N-1] 的随机 int。所以它是特定 RNG 的工厂。
我一直在使用ramda.js并学习函数式编程理论,我的问题是:是否可以randN
使用 ramda 以无点风格重写?
例如,我可以写:
var badAttempt = pipe(multiply(Math.random()), Math.floor)
这将满足“无点风格”的要求,但无法表现出与以下相同的方式randN
:调用badAttempt(10)
只返回一个介于 1 和 10 之间的随机数,而不是在调用时生成一个介于 1 和 10 之间的随机数的函数。
我还没有找到使我能够以无点样式进行重写的 ramda 函数组合。我不知道这是否只是我的失败,还是 using 的特殊之处random
,它破坏了引用透明度,因此可能与无点样式不兼容。
更新
在与 Denys 讨论后,我自己对解决方案的细微改动:
randN = pipe(always, of, append(Math.random), useWith(pipe(multiply, Math.floor)), partial(__,[1,1]))