2012-07-09 25 views
6
geçiriliyor

F # 'nin her zaman argümanları, köri stilini ve tuple stilini geçmenin iki farklı yolu olduğunu düşündüm. Bu gerçekten doğru mu?F # parametresi

Basitçe tek bir stil, curry stili ve bağımsız değişkenler basit değerler veya tuples olabilir.

örn.

someFunc (a,b) = 

bu tuple olur bir köri tarzı bağımsız değişkenle bir işlev değil? Bu yüzden pipleline operatörünü kullanarak bu işleve tuples iletmeme izin veriyor musunuz?

(1,2) |> someFunc 

Bu doğru (burada başlığın elemanları olarak adlandırılır)?

cevap

6

Bu sadece iyi çalışır - sen

yapmak zorunda - fark

let f (a,b) = ... 
let f2 a b = ... 

sonra kolayca kısmen uygulanan f2 oluşturabilir var, ama oldukça olarak güzel çalışmıyor f için zaman olduğunu

let partial = fun t -> f (1,t) 
let partial2 = f2 1 
+0

Evet, ve bu basitçe "f", adlandırılmış öğelere sahip bir tuple olan _one_ argümanına sahip olduğu için değil mi? Demek istediğim, "somefunc abc (d, e, f) g" gibi korkak şeyler yapabilirsin, ve bu açıkçası saf körelem ya da typle tarzıydı, ki bu sadece F # 'nin sadece körelme tarzına sahip olduğu, argümanların basitçe değerler veya tuple olduğu inancım vardı. Bunu düşünmenin doğru yolu bu mu? –

+0

Bu doğru. –

4

Evet, tüm F # işlevleri "köri stili" dir. Eğer böyle bir tanım varsa:

let someFunc (a,b) = a + b 

tek bir argüman alan bir işleve sahip, eşleşen desen (evet, desen eşleştirme böyle şaşırtıcı tatlı yerlerde kullanılabilir) tarafından ayrıştırılır olan bir kayıt düzeni. değişken kendisinde model uyuşum ile, aynı zamanda

let someFunc = function 
    | a, b -> a + b 

ilk sürümü eşdeğerdir

let someFunc t = 
    match t with 
    | a, b -> a + b 

: Bu model fonksiyonu gövdesine eşleşen hareket aşağıdaki tanım eşdeğerdir Bu basit adlandırılmış bağlanma örneğinde açıkça tercih edilir. Ancak, F# methods'un "tuple style" olduğunu unutmayın (bu, F # öğesinin standart .NET nesne yönelimli özelliklerine yapıştırıldığı yerlerden biridir).