如何将多个参数传递到 Ramda 撰写链中?

2023-11-30

以下是我尝试将四个函数组合成一个端点字符串:

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

这个组合有效并返回我想要的结果,即:

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

但请注意我是如何硬编码的值params and query在它们的函数体内。我看到只有一个值在增加这个值R.compose chain.

我到底如何以及在哪里传入参数参数和查询参数?

UPDATE:

我所做的就是柯里化这些函数,如下所示:

var R = require('ramda');

const endpoint = str => `${str}` || 'default'
const protocol = str => `https://${str}`
const setParams = R.curry ( (str, params) => `${str}?${params}` )
const setQuery = R.curry ( (str, query) => `${str}&query=${JSON.stringify(query)}` )

and then

let finalEndpoint = R.compose(protocol, endpoint)

var result = setQuery(setParams(finalEndpoint('api.content.io'), 'sort=desc&part=true'), { some:'value', another:'value'})

console.log(result);

但最后的电话得到result看起来仍然很粗糙和不优雅。有什么办法可以改善这一点吗?


我到底如何以及在哪里传入参数参数和查询参数?

老实说,当你构建一个compose or pipe与 Ramda 或类似库的管道。

Ramda(免责声明:我是作者之一)允许第一个函数接收多个参数——其他一些库可以,有些则不能——但后续函数只会接收先前调用的结果。里面有一个函数避难所, meld,这可能对此有所帮助,但它确实有一个相当复杂的 API。

但是,我真的不明白为什么你首先要以这种方式构建这个函数。这些中间函数实际上是可重用的,还是您是根据规范构建它们的?我问的原因是,这似乎是同一想法的更明智的版本:

const finalEndpoint = useWith( 
  (endpoint, params, query) =>`https://${endpoint}?${params}&query=${query}`, [
    endpoint => endpoint || 'default', 
    pipe(toPairs, map(join('=')), join('&')), 
    pipe(JSON.stringify, encodeURIComponent)
  ]
);

finalEndpoint(
  'api.content.io', 
  {sort: 'desc', part: true},
  {some:'value', another:'value'}
);
//=> "https://api.content.io?sort=desc&part=true&query=%7B%22some%22%3A%22value%22%2C%22another%22%3A%22value%22%7D"

我真的不知道你对最后一个参数的要求。如果没有那个,我看起来很奇怪encodeUriComponent,但也许你不需要它。我还随意使用了第二个参数,假设您更喜欢 API 中的实际数据而不是封装该数据的字符串。但如果你want通过'sort=desc&part=true',然后替换pipe(toPairs, map(join('=')), join('&')) with identity.

由于整个事情远非无积分,所以我没有使用第一个函数的无积分版本,也许or(__, 'default'),因为我认为那里的内容更具可读性。

Update

您可以在拉姆达 REPL,添加一些console.log声明与tap.


这确实给 Ramda 提出了一个有趣的问题。如果确实需要这些中间功能,Ramda 无法提供将它们组合起来的方法。显然 Ramda 可以提供类似的东西meld,但是有中间立场吗?我想知道是否有一个有用的函数(当然是柯里化的)我们应该包含它,它的作用类似于

someFunc([f0], [a0]); //=> f0(a0)
someFunc([f0, f1], [a0, a1]); //=> f1(f0(a0), a1)
someFunc([f0, f1, f2], [a0, a1, a2]); //=> f2(f1(f0(a0), a1), a2)
someFunc([f0, f1, f2, f3], [a0, a1, a2, a3]); //=> f3(f2(f1(f0(a0), a1), a2), a3)
// ...

有一些严重的反对意见:如果列表的长度不同怎么办?为什么初始调用是一元的,我们应该通过向函数添加单独的累加器参数来解决这个问题吗?尽管如此,这是一个有趣的功能,我可能会在 Ramda 板上提出它进行讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将多个参数传递到 Ramda 撰写链中? 的相关文章

  • Scala - 以函数方式修改字符串

    我刚刚开始使用 Scala 因此开始以更实用的方式做事 只是想知道是否有一种更实用的方法来实现如下所示的功能 def expand exp String String var result exp for k v lt libMap res
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • Rust 中带有纯宏的函数组合链

    我读了 如何在 Rust 中编写函数 https stackoverflow com questions 45786955 how to compose functions in rust Rust 中的函数组合链 https stacko
  • 函数式 GUI 编程可能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近发现了 FP bug 试图学习 Haskell 到目前为止所看到的东西给我留下了深刻的印象 一流的函数 惰性求值和所有其他好处 我还不是专
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 如何根据列表中的先前值过滤Haskell中的列表元素?

    我正在努力在 Haskell 中创建一个函数 该函数根据列表中前一个元素的条件过滤列表的数字 Example 前一个数字是 2 的倍数 myFunction 1 2 5 6 3 expected output 5 3 我知道如何申请filt
  • 我缺少什么:可以使用多个参数进行函数组合吗?

    我了解 F 中函数组合的基础知识 例如所述here http blogs msdn com b chrsmith archive 2008 06 14 function composition aspx 不过 也许我错过了一些东西 这 gt
  • 如何使用 swift flatMap 从数组中过滤掉选项

    我对 flatMap 有点困惑 添加到 Swift 1 2 假设我有一些可选类型的数组 例如 let possibles Int nil 1 2 3 nil nil 4 5 在 Swift 1 1 中 我会做一个过滤器 然后是一个像这样的地
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路

随机推荐