2016-03-25 17 views
8

Diğer birçok SO yanıtında atıfta bulunulan back-pipe (<|) işleci olduğunu biliyorum. Ancak bu zincirleme yaygın olan (|>), ileri borular ile kombine edildiğinde iyi çalışmaz. Ancak ilgili seçenekleri arıyorum. Temel olarak aşağıdaki fonksiyon tanımının yerleşik versiyonu var mı? Yoksa bu kötü/tehlikeli bir uygulama mı?

let inline (^%) f = f 

let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 


// compare to this, which doesn't compile (and would be hard to follow even if it did) 
let stuff = 
    [1;2;3] 
    |> Seq.filter <| (>) 2 
    |> Seq.map <| fun x -> x.ToString() 
+0

[İşlev Uygulama İşleci ($) içinde F #?] 'Nın olası kopyası (http://stackoverflow.com/questions/7183903/function-application-operator-in-f) –

+0

Nope. http://stackoverflow.com/q/7183903/3909293 –

+0

Haskell'in yanıtlaması için yeterli bilgiye sahip değilim, fakat [FsControl] (https://github.com/gmpl/FsControl) adresine bir göz atın ve cevapları arayın tarafından [Gustavo] (http://stackoverflow.com/users/446822/gustavo?tab=answers) –

cevap

8

F # bulunmayan kullanarak komutu ters tırnak ve bölümleri, infixing opsiyonel gibi bazı Haskell özellikleri vardır. Bu, belirli yapıları biraz daha ayrıntılı hale getirir.

Genellikle, ben sadece böyle yukarıdaki gibi fonksiyonların bir boru yazmak istiyorum:

let stuff = 
    [1;2;3] 
    |> Seq.filter (fun x -> x < 2) 
    |> Seq.map string 

Bu benim görüşüme göre, çok daha okunabilir. Örneğin, Seq.filter ^% (>) 2 kullanarak, ben 'tüm değerler 2'den büyük' ​​anlamına gelen, ancak o ne sattığını olduğunu okumak sezgisel ediyorum:

> let inline (^%) f = f;; 

val inline (^%) : f:'a -> 'a 

> let stuff = 
    [1;2;3] 
    |> Seq.filter ^% (>) 2 
    |> Seq.map ^% fun x -> x.ToString() 
    |> Seq.toList;; 

val stuff : string list = ["1"] 

Eğer şüphe kod okuyucu bırakırsanız neler Kod yapar, sadece herkesi daha az üretken yaptınız. Seq.filter (fun x -> x < 2)'u kullanmak daha ayrıntılı görünebilir, ancak okuyucuya açık değildir.

+0

İronik olarak orijinal olarak yazdım. Örnekte yazarken x -> x <2 'yi kullanın ve sonra "nah, birisi onu nasıl kısaltılacağını işaret edecek" diye düşünün. –

+0

http://blog.ploeh.dk/2016/03/01/ad-hoc-arbitraries-now-with-pipes/ ile ilgili olarak ^% 'vs' <| 'hakkında herhangi bir düşünce var mı? Sanırım bu durumda aynı şeyi yapıyorlar, bu yüzden dahili op ile de uğraşabilirler. Her ne kadar '%' zinciri bir '|' zincirindeyse yardımcı olur. –

+0

yani yapabiliriz Gen.elements [4..8] |> Arb.fromGen |> Prop.forAll ^% fun neighborCount -> ... ' –