在功能编程中喜欢Haskell,我可以定义函数
add a b = a+b
然后add 3
将返回一个带有一个参数的函数,并返回3 + something
我怎样才能在GO中做到这一点?
当我定义一个多于一个(比如n)参数的函数时,我是否只能给它一个参数并得到另一个带n-1个参数的函数?
更新:
对于我原来问题中不精确的字词感到抱歉。
我认为我的问题应该被问为两个问题:
感谢TheOnly92和Alex解决我的第二个问题。但是,我对第一个问题也很好奇。
答案 0 :(得分:27)
也许像
package main
import (
"fmt"
)
func mkAdd(a int) func(int) int {
return func(b int) int {
return a + b
}
}
func main() {
add2 := mkAdd(2)
add3 := mkAdd(3)
fmt.Println(add2(5), add3(6))
}
答案 1 :(得分:26)
扩展前一个答案,它允许您采用任意数量的参数:
package main
import (
"fmt"
)
func mkAdd(a int) func(...int) int {
return func(b... int) int {
for _, i := range b {
a += i
}
return a
}
}
func main() {
add2 := mkAdd(2)
add3 := mkAdd(3)
fmt.Println(add2(5,3), add3(6))
}
答案 2 :(得分:4)
您可以通过定义函数类型然后向其添加方法来更进一步。
package main
import "fmt"
type Add func(int, int) int
func (f Add) Apply(i int) func(int) int {
return func(j int) int {
return f(i, j)
}
}
func main() {
var add Add = func(i, j int) int { return i + j }
add3 := add.Apply(3)
fmt.Println("add 3 to 2:", add3(2))
}
您甚至可以尝试使用可变参数函数:
package main
import "fmt"
type Multiply func(...int) int
func (f Multiply) Apply(i int) func(...int) int {
return func(values ...int) int {
values = append([]int{i}, values...)
return f(values...)
}
}
func main() {
var multiply Multiply = func(values ...int) int {
var total int = 1
for _, value := range values {
total *= value
}
return total
}
var times2 Multiply = multiply.Apply(2)
fmt.Println("times 2:", times2(3, 4), "(expect 24)")
// ... and you can even cascade (if assigned the Multiply type)
times6 := times2.Apply(3)
fmt.Println("times 6:", times6(2, 3, 5, 10), "(expect 1800)")
}
希望这有帮助!