2012-07-09 15 views
6

Siempre he pensado que F # tenía dos formas diferentes de pasar argumentos, estilo de curry y estilo de tupla. ¿Es esto realmente correcto?F # parámetro que pasa

¿No es simplemente un estilo, el estilo de curry y los argumentos pueden ser valores simples o tuplas.

p. Ej.

someFunc (a,b) = 

no es ésta una función con el argumento de estilo un curry, que pasa a ser un par de valores? Esto me permite pasar tuplas a esta función usando el operador pipleline? (donde los elementos de la tupla debe su nombre)

(1,2) |> someFunc 

Es esto correcto?

Respuesta

6

Esto funciona muy bien - la diferencia es cuando se tiene

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

continuación, puede crear una f2 aplicado parcialmente con facilidad, pero para n caso de que no funciona tan bien - que tiene que hacer

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

Sí, ¿y no es esto simplemente porque "f" tiene _un_ argumento que pasa a ser una tupla con elementos nombrados? Quiero decir que puedes hacer cosas funky como "somefunc abc (d, e, f) g" y obviamente no es curry puro o estilo tipográfico, lo que me hizo pensar que F # solo tiene estilo curry, donde los argumentos son simplemente valores o tuplas. ¿Es esta la forma correcta de pensarlo? –

+0

Esto es correcto. –

4

Sí, todas las funciones de F # son de "estilo curry". Cuando se tiene una definición como:

let someFunc (a,b) = a + b 

Usted tiene una función que toma un argumento, una tupla, que está siendo descompuesto por coincidencia de patrones (sí, la coincidencia de patrones está disponible en lugares sorprendentemente dulces como este). Es equivalente a la siguiente definición que mueve el patrón de coincidencia con el cuerpo de la función:

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

Lo que también es equivalente a

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

La primera versión, con la coincidencia de patrones en el propio argumento , es obviamente preferible en esta instancia de enlaces nombrados simples.

Tenga en cuenta que F# methods, sin embargo, son de "estilo tupla" (este es uno de esos lugares donde F # se adhiere a las características orientadas a objetos .NET estándar).

Cuestiones relacionadas