2016-10-31 1 views
5

Ich möchte eine (einfache) mathematische Funktion zusätzlich in F # implementieren, was bedeutet:F # Funktion Addition

Stellen F das Feld aller Funktionen sein, die A auf ein Element von ein Element der Karte B: enter image description here
Dann meine "-Funktion Zusatz" sollte wie folgt definiert werden: enter image description here

ich folgendes Co versucht haben,

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

Allerdings, wenn ich die folgenden Zeilen kompilieren will, werde ich eine Fehlermeldung erhalten: de die Funktion zusätzlich als Betreiber !+ implementieren

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` 

ich mir ziemlich sicher bin, dass es verursacht durch einen einfachen logischen Fehler, aber ich konnte es noch nicht finden.
Meine Frage ist daher: Wie definiert man eine Funktion Addition in F #?

Antwort

8

Ganz in der Nähe! zwei Hauptpunkte:

  • !+ ist ein unärer Operator. Siehe the rules für F # -Operatoren.

  • Ihre Funktion nimmt Tupel. Es ist nicht Curry.

korrigieren und Sie erhalten es funktioniert:

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 

Lassen Sie mich hinzufügen, dass Sie brauchen keine Typanmerkung, F # wird es für Sie herausfinden:

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

Wenn Sie die Signatur lesen, werden Sie feststellen, dass Ihre Funktionen einen beliebigen Eingabetyp haben können. Nur die Ergebnistypen sollten übereinstimmen:

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

vielen Dank, mein Herr! – Unknown6656