2013-10-16 6 views
18

はHaskellのが好き、私はどうやってカレーランカレーができますか?関数型プログラミングで

add a b = a+b 

はその後add 3は一つのパラメータを取り、GOに3 + something

は、どのように私はこれを行うことができます返す関数を返す関数を定義することができますか?

複数の(たとえばn個の)パラメータを取る関数を定義するとき、そのパラメータを1つだけ与えることができ、n-1個のパラメータを取る別の関数を得ることができますか?

更新:私の元の質問で不正確な単語の

申し訳ありません。

私は私の質問は2 qeustionsよう頼まれるべきだと思う:

  • がGOの一部のアプリケーションですか?
  • カレーはどのように機能しますか?

ありがとうございますTheOnly92と私の第二の問題を解決するためのアレックス。しかし、私は最初の質問についても興味があります。

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

は、この情報がお役に立てば幸い!

関連する問題