2016-03-25 7 views
8

So che c'è l'operatore (<|) di ritorno, a cui si fa riferimento in diverse altre risposte SO. Ma questo non funziona bene se combinato con i tubi anteriori (|>), che è comune nel concatenamento. Comunque sto cercando le opzioni correlate. Fondamentalmente esiste una versione integrata della definizione della funzione sottostante? O è una pratica cattiva/pericolosa?

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

Possibile duplicato di [Operatore applicazione di funzione ($) in F #?] (Http://stackoverflow.com/questions/7183903/function-application-operator-in-f) –

+0

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

+0

Non ho abbastanza conoscenza su Haskell per rispondere, ma date un'occhiata a [FsControl] (https://github.com/gmpl/FsControl) e cercate le risposte di [Gustavo] (http://stackoverflow.com/users/446822/gustavo?tab=answers) –

risposta

8

ci sono alcune caratteristiche Haskell, come optional infissione utilizzando apici inversi, e sezioni, che non sono disponibili in F #. Ciò rende alcuni costrutti un po 'più prolissi.

Di solito, mi piacerebbe scrivere semplicemente un tubo di funzioni come sopra in questo modo:

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

Questa è, a mio parere, molto più leggibile. Ad esempio, utilizzando Seq.filter ^% (>) 2, avevo intuitivamente letto che nel senso 'tutti i valori superiori a 2', ma non è ciò che fa:

> 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"] 

Se si lascia il lettore del codice in dubbio di ciò che il codice sì, hai reso tutti meno produttivi. L'utilizzo di Seq.filter (fun x -> x < 2) potrebbe sembrare più dettagliato, ma non è ambiguo per il lettore.

+0

Ironicamente l'avevo originariamente scritto come' fun x -> x <2' quando si digita l'esempio e poi si pensa "nah, qualcuno indicherà come accorciarlo". –

+0

Qualche idea su '^%' vs '<|' riguardo a http://blog.ploeh.dk/2016/03/01/ad-hoc-arbitraries-now-with-pipes/? Immagino che facciano la stessa cosa in quel caso, quindi potrebbe anche limitarsi all'opzionale built-in. Anche se '^%' sarebbe di aiuto se fosse in una catena '|>'. –

+0

ie si potrebbe fare 'Gen.elements [4..8] |> Arb.fromGen |> Prop.forAll ^% fun neighborCount -> ...' –

Problemi correlati