groovy - 需要帮助理解使用常规闭包的柯里化(Currying)吗?

标签 groovy functional-programming currying

我试图了解柯里化(Currying)在函数式编程中的工作原理。我已经经历过wiki还有几个关于SO的相同问题。

Need help understanding lambda (currying)

What is 'Currying'?

我知道柯里化(Currying)就是将一个带有 n 个参数的函数拆分为 n 个或更少的函数,每个函数只有一个参数。我从理论上理解它,但在编码时无法将这些点连接起来。也许是我缺乏函数式编程语言或 C# 的知识(正如上述问题中的许多答案所涉及的那样)。

无论如何,我了解 groovy 和 java。所以我试图获得 groovy 中标准 add(a,b) 函数的大纲,但我无法完成它。

def closure = { arg ->
   // ??
}

def add(anotherClosure , a){
    return closure // ??
}

有人可以帮助我理解使用常规闭包进行柯里化(Currying)吗?

最佳答案

您可以通过编写一个闭包来推出自己的柯里化(Currying)功能,该闭包接受另一个闭包和一个柯里化(Currying)参数来设置,并返回一个使用该值的闭包。

// Our closure that takes 2 parameters and returns a String
def greet = { greeting, person -> "$greeting $person" }

// This takes a closure and a default parameter
// And returns another closure that only requires the
// missing parameter
def currier = { fn, param ->
  { person -> fn( param, person ) }
}

// We can then call our currying closure
def hi = currier( greet, 'Hi' )

// And test it out
hi( 'Vamsi' )

但是您最好坚持使用内置的 Groovy curry 方法 as shown by jalopaba 。 (还有 rcurryncurry 分别从右侧柯里化(Currying),并在给定位置柯里化(Currying))

应该说,Groovy curry 方法是一个用词不当,因为它更多的是 partial application 的情况。因为您不需要只需要一个参数,即:

def addAndTimes = { a, b, c -> ( a + b ) * c }

println addAndTimes( 1, 2, 3 ) // 9

def partial = addAndTimes.curry( 1 )

println partial( 2, 3 ) // 9

关于groovy - 需要帮助理解使用常规闭包的柯里化(Currying)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511779/

相关文章:

带命名参数的 Groovy 准备语句

java - 使用 Maven\issues with Nexus 调试 Grails 命令 "refresh-dependencies"

java - 填充以获取数字中的特定位数

functional-programming - 在 OCaml 中保证对函数返回值的赋值

haskell - 对 Yampa 开关的图表感到困惑

javascript - javascript中的curry函数是否使用闭包原则?

java - 在 Java 8 中构建 Map 以进行集成测试的重构方法 - 函数式编程的机会?

grails - Grails管理员(类似于Django的)

android - 静态类型语言中的生命周期方法

haskell - 在 Haskell 中将元组的元素作为参数提供给函数?