Haskellのような関数型プログラミングでは、関数を定義できます
add a b = a+b
次に、add 3
は、1つのパラメーターを受け取る関数を返し、3 + something
を返します。
GOでこれを行うにはどうすればよいですか?
複数(たとえばn)のパラメーターを受け取る関数を定義する場合、1つのパラメーターのみを指定して、n-1個のパラメーターを受け取る別の関数を取得できますか?
更新:
私の最初の質問の不正確な言葉でごめんなさい。
私の質問は2つの質問として尋ねられるべきだと思います:
2番目の質問を解決してくれたTheOnly92とAlexに感謝します。しかし、私は最初の質問にも興味があります。
前の答えを拡張するには、任意の数の引数を取ることができます。
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))
}
おそらく次のようなもの
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))
}
関数型を定義してからメソッドを追加することで、さらに一歩進めることができます。
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)")
}
お役に立てれば!