2016-10-31 24 views
5

私は意味、F#で(簡単な)数学的な機能追加を実装する:F#機能追加

の要素にの要素をマッピングされたすべての関数、の分野であることFを想像してみてB: 次のように続いてenter image description here
、私の "機能追加" を定義する必要があります。 enter image description here

私は、次のコを試してみました私は次の行をコンパイルしたい場合は、私はエラーになります

let inline (!+) (f1 : ^a -> ^b, f2 : ^a -> ^b) : ^a -> ^b = 
    let f (x : ^a) : ^b = 
     (f1 x) + (f2 x) 
    f 

:デ・オペレーター!+として機能追加を実装する

let f1 x : float = -x // negate x 
let f2 x : float = 2. * x // multiply by 2 
let f3 = f1 !+ f2 //error : Expexceted `float`, got `'a -> 'b` 

私はそれがあることを、かなり確信していますいくつかの単純な論理エラーによって引き起こされましたが、私はまだそれを見つけることができませんでした。
私の質問はこうです:どのようにF#で関数の追加を定義するのですか?

答えて

8

非常に近い! 二つの主要な問題:

  • !+単項演算子です。 F#演算子についてはthe rulesを参照してください。

  • あなたの関数はタプルを取ります。それはカレーされていません。

は、それを修正して、あなたはそれが働いて得る:

let inline (++) (f1 : ^a -> ^b) (f2 : ^a -> ^b) : ^a -> ^b = 
    let f (x : ^a) : ^b = 
     (f1 x) + (f2 x) 
    f 

let f1 x : float = -x 
let f2 x : float = 2. * x 
let f3 = f1 ++ f2 

は、私はあなたがどんなタイプの注釈を必要としない、F#はあなたのためにそれを把握することを追加してみましょう:

let inline (++) f1 f2 x = f1 x + f2 x 

シグネチャを読んだ場合、関数に入力タイプがあることに気づくでしょう。

let inline f1 x = -(float x) 
let f2 x : float = float (2 * x) 
let f3 = f1 ++ f2 
+0

ありがとうございます、サー! – Unknown6656

関連する問題