我需要一个函数,它接受任意数量的参数(所有相同的类型),对它们做一些事情然后给出一个结果.在我的具体情况下,参数列表是不切实际的.
当我查看haskell库时,我看到函数printf(来自模块Text.Printf)使用了类似的技巧.不幸的是,通过查看来源我无法理解这种魔力.
有人可以解释如何实现这一点,或至少一些网页/纸/任何我可以找到一个良好的描述吗?
动机:
我需要它的原因非常简单.对于学校(计算机科学课),我们需要编写一个能够"记录"数学表达式,将其表示为字符串的模块(通过为自己的数据类型编写Num/Real/etc的实例),并执行对它的各种操作.
此数据类型包含变量的特殊构造函数,可以由值或指定函数的任何值替换.其中一个目标是编写一个函数,它使用一些变量(类型对(Char,Rational))来表达这种表达式并计算表达式的结果.我们应该看看如何最好地表达函数的目标.(我的想法:该函数返回另一个函数,它接受与函数中定义的变量一样多的参数 - 似乎是不可能的).
我已经看到很多函数是根据模式定义的(f .) . g.例如:
countWhere = (length .) . filter
duplicate = (concat .) . replicate
concatMap = (concat .) . map
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
haskell functional-programming pointfree function-composition tacit-programming
我看过类似的问题和答案,但没有找到直接解决我问题的答案.我在努力理解如何使用Maybe或Either或Monads连同管道的功能.我想将函数连接在一起,但我希望管道停止并在任何步骤发生错误时返回错误.我正在尝试在node.js应用程序中实现函数式编程概念,这实际上是我对它们的第一次认真探索,所以没有答案会如此简单以至于侮辱我对这个主题的智慧.
我写了这样的管道函数:
const _pipe = (f, g) => async (...args) => await g( await f(...args))
module.exports = {arguments.
pipeAsync: async (...fns) => {
return await fns.reduce(_pipe)
},
...
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
const token = await utils.pipeAsync(makeACall, parseAuthenticatedUser, syncUserWithCore, managejwt.maketoken)(x, y)
Run Code Online (Sandbox Code Playgroud)