2017-05-15 56 views
0

使用R.view dinamicly ...我怎样才能获得动态视图从动态镜头

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); 
 

 
// NOT WORK... 
 
const randomRobot = R.pipe(lensRandomRobot, R.view); 
 
const robot = randomRobot(robotsNames); 
 

 
// THIS WORKS .. 
 
// const robot = R.view(lensRandomRobot(robotsNames))(robotsNames) // I dont want to pass the values twiice 
 

 
console.log(robot);
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.23.0/ramda.min.js"></script>

回答

1

你应该randomRobot如果你想避免重复使用R.converge代替R.piperobotsNames

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>

1

两件事情:

  • 从达蒙答案是罚款。 converge按预期完成工作。但有几种可供选择的方案需要考虑。 converge是非常拉姆达特有的。 FP世界更为人所熟知的东西可能会让你感兴趣。 lift比较常见。您可以使用它像这样:

    const randomRobot = R.lift(R.view)(lensRandomRobot, R.identity); 
    

    或者,也许最好是ap,这将是完美的,只是参数顺序view是什么ap用品相反,所以需要有一个flip以及*

    const randomRobot = R.ap(R.flip(R.view), lensRandomRobot); 
    

    你可以看到在Ramda REPL这些方法。其次,引入随机源在功能代码中是一个奇怪的想法。显然任何使用随机值的东西不再是透明的。这就是Ramda不提供随机/随机播放功能的原因。

    拉姆达在一点做了随机试验,尝试使用引用透明的版本。但最终它被放弃为糟糕的匹配,但that code可能会帮助您创建基于随机代码的可测试版本。


*的一点是,当ap被应用到的功能,它的行为是这样的:

ap(f, g)(x); //=> f(x)(g(x)) 

和功能咖喱的方式Ramda的是,这相当于

ap(f, g)(x); //=> f(x, g(x))