问题标签 [currying]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3997 浏览

c# - C#中的柯里化有什么好处?(实现部分功能)

C#中的柯里化有什么好处?

在柯里化函数上实现部分函数应用有什么好处?

0 投票
8 回答
320 浏览

function - 如何解释方法调用?

让我们考虑一个小方法:

和一些电话:

您如何向非技术人员解释这一点?谁有一个很好的比喻?

我多次尝试解释方法调用(或函数应用程序),但都失败了。好像在这里找不到合适的词。

问候,叉子

更新:对我来说,解释参数是如何传递/匹配的很重要。

0 投票
3 回答
415 浏览

c# - 挑战:更整洁的柯里化或部分应用 C#4 字符串的方式。加入

背景

我最近读到 .NET 4 的 System.String 类具有 Join 方法的新重载。这个新的重载需要一个分隔符和一个IEnumerable<T>允许将任意集合连接成单个字符串的方法,而无需转换为中间字符串数组。

凉爽的!这意味着我现在可以这样做:

...而不是这个:

...从而节省将每个项目转换为字符串,然后分配数组。

问题

但是,作为一般编程风格的粉丝,特别是 C# 中的方法链接,我希望能够编写如下内容:

虽然这不是合法的 C#。是的,我可以用 来做Enumerable.Aggregate,是的,我可以用我自己的 Join 扩展方法来做),但是这些方法很难阅读/效率低下,并且感觉像是一种逃避(分别)所以我想尝试做这是一种不同的方式。到目前为止,我设法得到的最接近的是:

...使用以下扩展方法:

这非常冗长,需要显式定义参数和字符串的返回类型。我要使用的加入重载,并且依赖于 C#4 的方差特性,因为我们将参数之一定义为 IEnumerable 而不是 IEnumerable。

挑战

你能找到一种使用方法链式编程的更简洁的方法吗?

这个挑战是关于尝试在 C# 中找到一种简洁的方式来对具有多个重载的函数进行 curry - 这只是为了好玩!

0 投票
4 回答
891 浏览

f# - F# 柯里化效率?

我有一个如下所示的函数:

这个函数可以用来快速检查一个元素在语义上是否是某个集合的一部分;例如,要检查文件路径是否属于 html 文件:

但是,当我使用上述函数时,性能很差,因为在“isInSet”中编写的函数体的评估似乎被延迟到所有参数都已知 - 特别是,(Set.ofList setElems).Contains每次执行isHtmlPath.

我怎样才能最好地保持 F# 的简洁、易读的性质,同时仍然获得更有效的行为,其中集合构造被预先评估。

以上只是一个例子;我正在寻找一种通用方法,以避免让我陷入实施细节 -在可能的情况下,我想避免被实施的执行顺序等细节分心,因为这对我来说通常并不重要,并且有点破坏主要卖点函数式编程。

0 投票
4 回答
612 浏览

language-agnostic - 柯里化只是一种避免继承的方法吗?

因此,我对柯里化(基于 SO 问题)的理解是,它可以让您部分设置函数的参数并返回“截断”函数作为结果。

如果你有一个大毛函数需要 10 个参数,看起来像

并且您想要一个“子集”函数,它可以让您处理除 之外的所有预设,jumpShot%您不应该只拆分一个继承自原始函数的类吗?

我想我正在寻找的是这种模式的用例。谢谢!

0 投票
1 回答
401 浏览

function - OCaml:没有定义值的柯里化

我有两个函数 f 和 g 我正在尝试,return f(g(x))但我不知道 x 的值,我不确定如何去做。

一个更具体的例子:如果我有函数f = x + 1并且g = x * 2我正在尝试return f(g(x))我应该得到一个等于的函数(x*2) + 1

0 投票
2 回答
420 浏览

programming-languages - 是否有一种编程语言在省略命名参数时执行柯里化?

许多函数式编程语言都支持柯里化参数。为了支持柯里化函数,函数的参数本质上是一个元组,其中最后一个参数可以省略,从而使新函数需要更小的元组。

我正在考虑设计一种始终使用记录(又名参数)作为函数参数的语言。

因此,我相信语言中的简单数学函数将是:

您可以将任何记录传递给这些函数,只要它们具有这两个命名参数(它们可以有更多“左”和“右”)。

如果它们只有一个命名参数,它会创建一个新函数:

我在上面借用了一些haskell 的符号

有没有人见过这样的语言?

0 投票
2 回答
2586 浏览

python - 循环中的python中的currying函数

所以这里有一些代码可以简化我一直在做的事情:

这是它的输出:

我希望得到 charlie,然后是 cindy,为什么 cindy 会显示两次?

0 投票
3 回答
2055 浏览

django - Django - 限制对超级用户的 url 访问

在我的 urlconf 中,我有:

我想做的是将对该应用程序的任何访问限制为超级用户。我试过这个:

但它抱怨 decorate 只需要 1 个参数,而我给了两个参数。

我正在考虑通过 functools.partial 对装饰器进行咖喱,但我认为我可能会错过一些更明显的解决方案。

0 投票
1 回答
1173 浏览

f# - 是否可以在 F# 中使用中间函数参数?

这是运行良好的代码:

所以我可以写表达式“h 1”,FSI 显示:

如果我调用“h 1 2 3”,则参数将以正确的顺序应用。
但是如果最后一个参数的类型不同,事情就会不同:

现在最后一个函数 hh 会导致错误消息:

Script.fsx(119,10):错误 FS0001:类型不匹配。期待 astring -> 'a 但给定 a int -> string -> int。类型与类型string不匹配int

我理解为什么会发生这种情况——“z”附加到“ff x”之后,使其成为第二个参数。但是我希望在第一个示例表达式中“h 1 2 3”不能正常工作(作为“f 1 3 2”执行)。但它工作得很好。