2011-08-25 15 views
11

Digamos que tengo este código

let identifier = spaces_surrounded (many1Satisfy isLetter) 

Me preguntaba si había alguna F # función nativa que me permitió refactorearlo a

let identifier = spaces_surrounded $ many1Satisfy isLetter 

, es decir, algo como

let ($) f1 f2 = f1 (f2) 

(es decir, si no me equivoco, mis habilidades Haskell no son demasiado nítidas ...).

Respuesta

16

La norma F # lenguaje de esto es el operador de la tubería hacia adelante |> eran usted reescribir

let identifier = spaces_surrounded (many1Satisfy isLetter) 

como

let identifier = many1Satisfy isLetter |> spaces_surrounded 

también se puede utilizar el operador de la tubería hacia atrás <| si se quiere mantener la orden original, pero esto tiende a ser un poco menos común

let identifier = spaces_surrounded <| many1Satisfy isLetter 
+0

Hmm, así que parece <| es lo que estaba buscando. ¿Cuál es su definición? –

+5

Es 'let inline (<|) fx = fx' como se ve aquí: https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/prim-types.fs – Brian

+2

Tenga en cuenta que la definición de sus propios operadores a la Haskell está sujeta a las reglas F # de asociatividad/precedencia, por ejemplo vea http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597402 – Brian