2014-10-01 25 views
13

Son zamanlarda (arka planım C#) olan F # yi alıyorum ve çok faydalı bulduğum http://fsharpforfunandprofit.com sitesini okuyorum.(Kestrel) K-birleştirici: neden yararlıdır?

Taraklayıcıların bulunduğu bölüm olan http://fsharpforfunandprofit.com/posts/defining-functions/'a sahibim. Kestrel haricinde hepsini (her ne kadar aklımdaki Y birleştiricisi veya Adaçayı kuş vidaları olsa da) anlıyorum. Beni hayat bu yararlı olacağını herhangi bir durum için anlayamıyorum

let K x y = x 

: Scott Wlaschin olarak (F #) tanımını verir. İlk başta zincir operatörü olarak kullanılabileceğini düşündüm, böylece bir işleve bir değer iletebilir ve sonra orijinal değeri geri alabilirsin. o zaman geri argüman yok sayar bir fonksiyon olsun biz kısmen (5 değeriyle) K bağdaştırıcının uygularsanız

let (>|) x f = f x; x 

: Kendimi daha önce böyle bir operatör yazdım ama gördüğünüz gibi aynı şey değil ve bunun yerine 5 döndürür. Yine, yararlı değil.

(K 5) = fun y -> 5 

kimse bana bu lütfen kullanılabilecek nereye kolay bir örnek verebilir misiniz?

en ı işlevlerini haritalayabilirsiniz bir listesi gibi bir yapıya sahip varsayalım:

+1

: Şuna bir bakın: https://en.wikipedia.org/wiki/SKI_combinator_calculus - gerçekten sadece akademik eğlence - F # içinde bazı kullanımlar bulsanız bile, sadece "K" ^^ – Carsten

+1

BTW hemen onu bulamazsanız - 'K' örneğin SKI calculuse booleans, tuples, sayıları, ... gibi şeyleri uygulamak için kullanılır (iyi bir temel yapı taşı;)) - sadece düşünün * İlk bileşen * – Carsten

+0

için bir tür projeksiyon olarak Teşekkürler, ben Vikipedi sayfasını okudum ama zaten sahip olduğumdan daha fazla bilgi vermedi. – Richiban

cevap

14

İşte çok kolay bir örnektir.

let K x y = x 

let lst = [3;5;13;2] 

böyle matematik fonksiyonlarını haritalayabilirsiniz:

let plus5 = lst |> List.map ((+)5) // instead of writing List.map (fun x -> 5 + x) 
// val plus5 : int list = [8; 10; 18; 7] 

let times3 = lst |> List.map ((*)3) // instead of writing List.map (fun x -> 3 * x) 
// val times3 : int list = [9; 15; 39; 6] 

Ne sabit bir fonksiyonu eşleştirmek isterseniz? FP içinde genellikle argüman gibi işlevleri geçmesi göz önüne alındığında

let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10) 
// val tens : int list = [10; 10; 10; 10] 

, K combinator Eğer birkaç tuşa basarak sabit bir fonksiyonu belirlemenizi sağlar.

+0

Teşekkürler Gustavo, bu da bana da oldu, ben 'id' de ('lst |> sortBy id' gibi) kullanacağım ama yine de bir haritadaki sabit bir işlevin noktasını almadığı zamanlar . Eşdeğer SQL 'dbo.Customers'dan 5 seçecektir. Belki düşünmeye devam edeceğim. – Richiban

+0

Evet, bu SQL'de bir eşdeğerdir, ancak FP'de işlevleri bir kural değerlendiricisinin mantığını ve bir kuralı ayırabilecek şekilde oluşturabilirsiniz. Kuralları işlevler olarak düşünün ve ek bir parametreye ihtiyaç duymayan basit bir kurala sahip olabilirsiniz. Zaman zaman K birleştiriciyi kullandığım gibi kendi kendime yazmamı tekrarlamaktan kaçınmak için '' fun x -> birşey '' – Gustavo

+0

gerçek ve gerçek durumdaki güzel bir örnek elbette çok daha okunabilir '' dır .4 10 '(veya '10 |> Liste'yi kopyalayın.4 ') yineleyin – Carsten

İlgili konular