go-lang咖喱怎么能吃?

在像 Haskell 这样的函数式编程中,我可以定义函数

add a b = a+b

然后add 3将返回一个带一个参数的函数并将返回3 + something

我怎样才能在 GO 中做到这一点?

当我定义一个接受多个(比如 n 个)参数的函数时,我可以只给它一个参数并获得另一个接受 n-1 个参数的函数吗?

更新

对不起,我原来问题中的措辞不准确。

我认为我的问题应该作为两个问题来问:

  • GO中有部分应用吗?

  • GO 如何做功能咖喱?

感谢 TheOnly92 和 Alex 解决了我的第二个问题。不过,我也很好奇第一个问题


跃然一笑
浏览 137回答 3
3回答

白猪掌柜的

扩展上一个答案,它允许您采用任意数量的参数:package mainimport (    "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))}

侃侃无极

也许像package mainimport (    "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))}

潇湘沐

您可以通过定义函数类型然后向其添加方法来更进一步。package mainimport "fmt"type Add func(int, int) intfunc (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 mainimport "fmt"type Multiply func(...int) intfunc (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)")}希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go