如何使用Ramda编写两个以上的函数?

时间:2016-12-30 17:27:20

标签: functional-programming composition ramda.js

这是我第一次尝试使用Ramda进行函数式编程。我正在尝试通过组合多个函数来构建api端点字符串。

这有效:

const endpoint = str => str && str.toUpperCase() || 'default'
const protocol = str => `https://${str}`
let finalEndpoint = R.compose(protocol, endpoint)

var result = finalEndpoint('api.content.io')

结果现在是预期的https://API.CONTENT.IO

但现在我想为此管道添加更多功能:

const params = val => `?sort=desc&part=true`
const query = val => `query={ some: value, another: value}`

但是当我试图像这样把所有东西组合在一起时:

let finalEndpoint = R.compose(protocol, endpoint, params, query)
var result = finalEndpoint('api.content.io')

我得到https://?SORT=DESC&PART=TRUE而我想要

https://API.CONTENT.IO??sort=desc&part=true&query={ some: value, another: value}

我使用链接和组合的哪种组合来获得上述结果?

2 个答案:

答案 0 :(得分:1)

Ramda用户似乎熟悉的一个变体就是在匿名函数的管道中写这个:

const finalEndpoint = pipe(
  or(__, 'default'),
  concat('https://'),
  concat(__, '?sort=desc&part=true&'),
  concat(__, 'query={ some: value, another: value}')
)

finalEndpoint('api.content.io'); 
//=> https://api.content.io?sort=desc&part=true&query={ some: value, another: value}

这样的免费版本可能或可能不符合您的口味,但它是一个有趣的选择。

答案 1 :(得分:0)

var R = require('ramda');

const endpoint = str => `${str}` || 'default'
const protocol = str => `https://${str}`
const params = str => `${str}?sort=desc&part=true&`
const query = str => `${str}query={ some: value, another: value}`

let finalEndpoint = R.compose(query, params, protocol, endpoint)

var result = finalEndpoint('api.content.io')

console.log(result)

原来我没有正确使用str参数