2016-08-21 6 views
1

2つの値と関数を受け入れる関数を作りたいと思います。私はトラブルの構文を理解することが生じていますので、私は、最小限の例を作った:私は、コンパイル・エラーが発生しますがF#で関数を受け入れる関数

> foo(2, 3, fun x y -> x + y) 
5 

let foo (x : int, y : int, func : int -> int -> int) = 
    func(x, y) 

Anが出力を意図

The expression was expected to have type int, but here has type 'a * 'b 

どのようにすべきですこれは書かれていますか?

答えて

6

あなたはあなたのような括弧を使用して、この

func x y 

のような引数は、C型言語で'a * 'bがあるものであるタプルが作成されますでしょう渡しfuncを呼び出す必要があります。

また、/ fooを呼び出してもタプルを使用しています。

おそらく、ちょうどこの

let foo x y f = 
    f x y 

を行うと、型推論はそれを把握させることができます。 (x, y)のように角かっこで物を入れると、必要がないときにタプルが作成されます。

3

あなたはあなたがすることができる型推論とカリー引数行いたい場合は:あなたはあなたが行うことができますタプルを使用したい場合はfoo 2 3 (fun x y -> x + y)

のようにそれを使用して

let foo (x : int) (y : int) (func : int -> int -> int) = 
    func x y 

を:

let foo (x, y, func) = 
    func x y 

次に例のように使用できます。foo(2, 3, fun x y -> x + y)

あなたは、型推論、あなたが行うことができますタプル行いたい場合:

let foo ((x, y, func) : (int * int * (int -> int -> int))) = 
     func x y 

をし、それがちょうどtupledたときと同じように使用しています。

関連する問題