为了账号安全,请及时绑定邮箱和手机立即绑定

go-lang咖喱怎么能吃?

go-lang咖喱怎么能吃?

Go
跃然一笑 2021-06-30 09:47:42
在像 Haskell 这样的函数式编程中,我可以定义函数add a b = a+b然后add 3将返回一个带一个参数的函数并将返回3 + something我怎样才能在 GO 中做到这一点?当我定义一个接受多个(比如 n 个)参数的函数时,我可以只给它一个参数并获得另一个接受 n-1 个参数的函数吗?更新:对不起,我原来问题中的措辞不准确。我认为我的问题应该作为两个问题来问:GO中有部分应用吗?GO 如何做功能咖喱?感谢 TheOnly92 和 Alex 解决了我的第二个问题。不过,我也很好奇第一个问题
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

扩展上一个答案,它允许您采用任意数量的参数:


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))

}



查看完整回答
反对 回复 2021-07-05
?
侃侃无极

TA贡献2051条经验 获得超10个赞

也许像


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))

}


查看完整回答
反对 回复 2021-07-05
?
潇湘沐

TA贡献1816条经验 获得超6个赞

您可以通过定义函数类型然后向其添加方法来更进一步。


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)")

}

希望这可以帮助!


查看完整回答
反对 回复 2021-07-05
  • 3 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信