2016-10-31 90 views
5

Funkcja Chcę zaimplementować (proste) matematyczny dodatek funkcyjny w F #, to znaczy:F # Dodanie

Wyobraź F jest pole ze wszystkich funkcji, które map element do elementu B: enter image description here
Wtedy, moja "dodatek funkcja" powinny zostać zdefiniowane w następujący sposób: enter image description here

próbowałem następujących cO de wdrożyć dodatek funkcyjny jako operator !+:

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

Jednakże, jeśli chcę skompilować następujące wiersze, będę się błąd:

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` 

jestem całkiem pewny, że jest to spowodowany prostym błędem logicznym, ale wciąż nie mogłem go znaleźć.
Moje pytanie brzmi: jak zdefiniować dodawanie funkcji w F #?

Odpowiedz

8

Dość blisko! dwa główne problemy:

  • !+ jest operator jednoargumentowy. Zobacz the rules dla operatorów F #.

  • Twoja funkcja przyjmuje krotki. To nie jest curry.

Poprawnie to i dostać pracy:

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 

Dodam, że nie potrzeba żadnego typu adnotacji, F # będzie zrozumieć to dla Ciebie:

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

Jeśli odczytasz podpis, zauważysz, że twoje funkcje mogą mieć dowolny typ wejścia, tylko typy wyników powinny być zgodne:

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

dziękuję bardzo, Sir! – Unknown6656