2013-10-16 172 views
18

在函數式編程Haskell的喜歡,我可以定義功能怎麼去朗朗咖喱?

add a b = a+b 

然後add 3將返回取一個參數,並返回3 + something

我怎樣才能做到這一點GO功能?

當我定義一個函數需要多個(比如n個)參數時,我只能給它一個參數並獲得另一個函數,它需要n-1個參數嗎?

更新

對不起,在我原來的問題不精確的話。

我覺得我的問題應該問兩個qeustions:

  • 是否有GO部分應用程序?
  • 如何去做功能咖喱?

感謝TheOnly92和Alex解決我的第二個問題。但是,我對第一個問題也很好奇。

+0

你有什麼時候需要這個的真實世界的例子嗎? –

回答

22

爲了擴展在以前的答案,它允許你利用參數任意數量的:通過定義一個函數

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)) 
} 
+0

感謝您的回答。這非常有幫助!但是,我想知道GO中是否存在「部分應用」? – lazywei

+0

據我所知,不,但你可以做一個「工廠」功能,在這種情況下,像這種情況下,一個功能,以特定的方式創建另一個功能。 – TheOnly92

21

也許類似

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)) 
} 
+0

感謝您的回答! – lazywei

+0

我在移動網站上投了這個贊,但我必須發短信給胖子。如果你編輯這個答案,我可以糾正這個錯誤。 – weberc2

2

你可以把它一步鍵入並添加一個方法。

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

希望這有助於!