构成Ramda镜头的正确方法是什么?

时间:2017-09-29 10:28:33

标签: javascript functional-programming ramda.js lenses

我无法绕过这条管道。给定一组学生,我想映射它们,根据现有属性(icon)的值添加新属性(grade)。我暂时忽略了映射部分并专注于每个问题,从而将问题分解为更小的部分。

条件

为此,我决定使用R.cond

Getter and Setter

我正在使用镜头

完整代码

const student = {
    "studentName" : "Nancy",
    "grade": "junior",
}

const gradeLens = R.lensProp('grade')
const iconLens = R.lensProp('icon')

const findCondition = R.cond([
  [ R.equals('sophomore'), R.always('bath') ],
  [ R.equals('junior'), R.always('envelope-open') ],
  [ R.equals('senior'), R.always('microchip') ]
])

//Compose the functions together
const setStudentIcon = R.compose(R.set(iconLens), findCondition, R.view(gradeLens))

R.set需要3个参数,这意味着必须像这样调用此函数:

setStudentIcon(student)(student)

我对功能编程还不太了解,但这似乎不是构成镜头的正确方法。

1 个答案:

答案 0 :(得分:0)

你可以这样写:

const setStudentIcon = R.chain(
  R.compose(R.set(iconLens), findCondition), 
  R.view(gradeLens)
);

setStudentIcon(student);
//=> {grade: 'junior', icon: 'envelope-open', studentName: 'Nancy'}

这利用了chain对函数的处理方式,即chain(f, g)(x) //=> f(g(x), x)

您可以在 Ramda REPL 上看到这一点。