【问题标题】:How to use Ramda compose with more than two functions?如何使用具有两个以上功能的 Ramda compose?
【发布时间】:2017-05-14 23:42:01
【问题描述】:

这是我第一次尝试使用 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}

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

【问题讨论】:

    标签: functional-programming composition ramda.js


    【解决方案1】:
    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 参数

    【讨论】:

      【解决方案2】:

      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}
      

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

      【讨论】:

      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多