2016-10-31 75 views
5

Ben anlamına gelen F # (basit) matematiksel fonksiyon ekleme uygulamak istiyorum:F # Fonksiyon ilavesi

bir elemana A unsurunu haritasına tüm işlevleri, alan olmak F düşünün aşağıdaki eş denedi enter image description here

: B şu şekildedir: Sonra enter image description here
, benim "fonksiyonu ilave" tanımlanmalıdır Ben aşağıdaki satırları derlemek istiyorsanız bir hata alacak,

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

Ancak: o olduğunu,

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` 

Ben eminim de operatörü !+ olarak işlev ek uygulamak bazı basit mantıksal hatalardan kaynaklanıyordu, ancak henüz bulamadım.
Sorum şu ki: F # içinde bir işlev eki nasıl tanımlanır?

cevap

8

Oldukça yakın! iki ana konular:

  • !+ bir tekli bir operatördür. F # operatörleri için bkz. the rules. İşleviniz tuples alıyordur. Kör değil. o ve bunu çalışır hale

Doğru:

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 

beni her tür ek açıklaması gerekmez ekleyelim, F # sizin için bunu anlamaya olacaktır:

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

İmzayı okursanız, işlevlerinizin herhangi bir giriş türü olabileceğini fark edersiniz, sadece sonuç türleri eşleşmelidir:

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

Çok teşekkürler efendim! – Unknown6656