F # 4: Let / Use / Do

En esta publicaci贸n, veremos los enlaces en F #, en particular, veremos Let / Use / Do. Ahora puede que se pregunte qu茅 son los enlaces, y dado que a煤n no los hemos examinado, ahora es el momento de hablar al respecto.

En pocas palabras, un enlace asocia un identificador con un valor o funci贸n.

Dejar


Utiliza la palabra clave let para asociar un nombre con un valor o funci贸n. En realidad, hay un uso sutil y diferente de Let, donde uno se declara en el nivel superior del m贸dulo y luego el otro, donde definimos un contexto local. Aqu铆 hay un ejemplo de ambos:

module DemoModule = let someFunction = let a = 1 let b = 2 a * b 

Podr铆amos acceder a someFunction usando un nombre totalmente calificado, como DemoModule.someFunction, pero los enlaces Let (a, b) anidados solo est谩n disponibles para el nivel superior Let. Por lo general, ve m谩s casos cuando usamos el enlace Let para declarar algunos valores del m贸dulo interno, as铆 que concentremos nuestros esfuerzos all铆 (aunque es importante saber que puede usar Let en el nivel del m贸dulo).

As铆 que veamos algunos ejemplos m谩s.

 let aString ="this is a string" let aInt = 12 let aDecimal = 12.444 let aPiFunction () = Math.PI let aSquareRootFunction (x) = Math.Sqrt(x) let aFullyTypedSquareRootFunction (x :float) = Math.Sqrt(x) let a,b = "a","tuple" 

Puede ver que podemos usar el enlace Let para enlazar a m煤ltiples valores, que pueden ser de varios tipos, como:

  • Entero
  • Decimal
  • Funci贸n sin par谩metros de entrada
  • Funci贸n con par谩metros de entrada (donde el sistema de inferencia l贸gica del tipo F # elegir谩 el tipo correctamente)
  • Una funci贸n que tiene tipos de par谩metros completamente definidos.
  • Tupla (en este caso, String * String tuple)

En otro lugar, puede ver el enlace Let en la clase, pero discutiremos esto con m谩s detalle en el pr贸ximo art铆culo de esta serie.

Puede leer m谩s sobre el enlace Let en MSDN.

Uso


El enlace Use es muy similar al enlace Let porque vincula el valor al resultado de la expresi贸n. La principal diferencia es que el enlace Usar est谩 dise帽ado para funcionar con tipos desechables ID y elimina autom谩ticamente un valor cuando ya no est谩 dentro del alcance. Esto es muy similar a la palabra clave que usa .NET, aunque no creo que el enlace de uso de F # sea exactamente el mismo que usar en .NET, ya que la palabra clave que usa en .NET es en realidad un intento / finalmente con una llamada a Dispose ( ) en finalmente.

Ya hemos visto un ejemplo del enlace Usar en la 煤ltima publicaci贸n sobre formato de texto, pero solo para recordarnos, echemos otro vistazo a esto.

 use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close() 

En este ejemplo, el enlace Usar garantiza que el m茅todo StreamWriter llamar谩 a su m茅todo Dispose () despu茅s de llamar a sw.Close (), como se muestra arriba.

El uso solo funciona con IDisposables, y obtendr谩 un error de compilaci贸n si intenta usarlo con otra cosa, como se muestra a continuaci贸n:

imagen

Dado que el m茅todo Dispose () se llama al final del enlace Use, se debe tener cuidado de no devolver el valor asociado con Let.

 let Write = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") sw 

Si necesita volver a pasar IDisposable, que son parte del enlace Usar, puede usar la devoluci贸n de llamada. Algo como esto funcionar谩, pero me detendr铆a y me preguntar铆a si dise帽贸 su dise帽o correctamente si hace tales cosas:

 let Write callback = use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "Write is writing to the StreamWriter" callback sw sw let callback sw = fprintf sw "sw is the StreamWriter" let disp = Write callback 

Hacer


El enlace do se usa para ejecutar c贸digo sin definir una funci贸n o valor. Un enlace DEBE devolver siempre la Unidad (sin valor / nulo). En muchos casos, puede omitir el enlace Do y todo funcionar谩 como se espera.

Estos son algunos ejemplos del uso de enlaces Do.

 do printf "doing the do" //oh oh not a unit do printf "print a sum %i" 1 + 1 do 1 + 1 

Si, en cambio, le muestro una captura de pantalla con el c贸digo anterior, ver谩 que el compilador se quejar谩 si intenta usar Do con un resultado que no sea de la Unidad.

imagen

Tienes dos opciones:

  • Use un operador canalizado para ignorar el resultado
  • Crear dejar de enlace

Mostr茅 un ejemplo de cada uno de ellos a continuaci贸n:

 let x = 1 + 1 do printf "print a sum %i" x do (1+1 |> ignore) 

Let! Uso! Hacer!


Aunque todav铆a no quiero discutirlos, a veces puede que accidentalmente veas Let! Uso! Do!, Y cuando haces esto, esto es parte de lo que se llama una expresi贸n computacional. Lo m谩s probable es que vea esto en los flujos de trabajo as铆ncronos de F #, que cubriremos en uno de los art铆culos finales. Si entiendo lo suficiente, incluso puedo tratar de explicar c贸mo puede crear su propia "Expresi贸n computacional", aunque son un concepto bastante abstracto y un tema bastante complicado, por lo que ahora no es el momento para ellos.

Source: https://habr.com/ru/post/470195/


All Articles