‘,’哆啦A梦’,‘Awesom-O’,‘HK-47’,‘ED-209’,’啤酒取食 机器人 </跨度> ”, ‘Bishop’,‘The Energizer Bunny’,‘Clank’,‘Daft Punk’,‘Johnny 5’,‘The 机器人 </跨度> ’,‘Roboto’,‘Marvin the Paranoid Android’, “ 乐高玩具 </跨度> 使用R.view dinamicly …
const robotsNames = [‘达芬奇手术系统’,‘KITT’,‘Tachikomas’,‘丰田小提琴演奏 机器人 </跨度> ”, ‘GERTY’,‘Mega Man’,’摇滚 Em袜子 Em机器人
两件事情:
达蒙的答案很好。 converge 按预期完成工作。但是有几种选择需要考虑。 converge 是特定于Ramda的。 FP世界更熟悉的东西可能会引起你的兴趣。 lift 更常见。你可以像这样使用它:
converge
lift
const randomRobot = R.lift(R.view)(lensRandomRobot, R.identity);
或者,也许是最好的 ap ,除了参数顺序之外,这将是完美的 view 与此相反 ap 用品,所以需要一个 flip 同样 * :
ap
view
flip
const randomRobot = R.ap(R.flip(R.view), lensRandomRobot);
你可以看到这些方法 的 Ramda REPL 强> 。
其次,引入随机源是功能代码中的一个奇怪想法。显然,使用随机值的任何内容都不再是引用透明的。这就是Ramda不提供随机/随机函数的原因。
Ramda在某一点尝试了随机性,尝试使用引用透明版本。但最终它被放弃了一场糟糕的比赛,但是 那段代码 可能会帮助您创建基于随机代码的可测试版本。
* 关键在于何时 ap 应用于函数,它的行为如下:
ap(f, g)(x); //=> f(x)(g(x))
而对于Ramda的方式来说,这相当于
ap(f, g)(x); //=> f(x, g(x))
你应该用 R.converge 代替 R.pipe 在 randomRobot 如果你想避免重复 robotsNames
R.converge
R.pipe
randomRobot
robotsNames
const robotsNames = [ 'da Vinci Surgical System', 'KITT', 'The Tachikomas', 'Toyota violin-playing robot', 'GERTY', 'Mega Man', 'Rock ��Em Sock ��Em Robots', 'Doraemon', 'Awesom-O', 'HK-47', 'ED-209', 'Beer-Fetching Robot', 'Bishop', 'The Energizer Bunny', 'Clank', 'Daft Punk', 'Johnny 5', 'The Robot', 'Roboto', 'Marvin the Paranoid Android', 'Lego Mindstorms NXT', 'Robbie', 'Astro Boy', 'The Iron Giant', 'Optimus Prime', 'Roomba', 'DJ Roomba', 'Cindi Mayweather', 'Rosie', 'Crow T. Robot/Tom Servo', 'K-9', 'The Terminator', 'The Maschinenmensch, aka Maria', 'ASIMO', 'GLaDOS', 'HAL 9000', 'The Final Five', 'Sojourner', 'Data', 'R2D2', 'Bender Bending Rodriguez', 'Wall-E' ]; const getRandomInt = R.curry((min, max) => { return Math.floor(Math.random() * (max - min + 1)) + min; }) const getRandomFromZero = getRandomInt(0); const lensRandomRobot = R.pipe(R.length, getRandomFromZero, R.lensIndex); // CHANGE MADE HERE const randomRobot = R.converge(R.view, [lensRandomRobot, R.identity]); const robot = randomRobot(robotsNames); console.log(robot);
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.23.0/ramda.min.js"></script>