功能Ramda传递函数参数超出范围

时间:2017-11-12 15:48:59

标签: javascript functional-programming composition ramda.js

采用以下示例命令式JavaScript示例:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  if(hasCat){
    baseAnimals.cat = animLib.cat();
  }
  return baseAnimals
}

我试图用Ramda的函数风格编写这段代码,但我能做到的唯一方法就是让函数超出范围:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  return when(always(hasCat), merge({hasCat: animLib.cat()}))(baseAnimals)
}

撇开animLib超出范围的方式,我修复的方式hasCat来自外部传递(如果这是一个问题)是以下内容:

getAnimalList = (hasCat) => {
  const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()};
  const mergeCat = when(compose(equals(true), prop('hasCat')), 
              compose(merge({hasCat: animLib.cat()}), prop('baseAnimals')));
 return mergeCat({hasCat: hasCat, baseAnimals: baseAnimals});
}

但是这使得代码非常冗长。有一个更好的方法吗?或者是冗长只是保持代码更纯粹的成本。

1 个答案:

答案 0 :(得分:1)

在我看来,这样做会很好:

urllib2.URLError: <urlopen error no host given>

因为Ramda的getAnimalList = (animLib, hasCat) => { const baseAnimals = { dog: animLib.dog(), bear: animLib.bear()}; return hasCat ? merge({hasCat: animLib.cat()}, baseAnimals) : baseAnimals; } when是基于谓词函数而不是布尔值,所以在这里使用它们似乎有些过分。

显然,如果您想要一个范围为ifElse的版本,您可以使用Ramda的curry或仅更改为

来解决此问题。
animLib

然后您可以创建getAnimalList = (animLib) => (hasCat) => { /* ... */ }