Pregunta

Parece que aquí en StackOveflow hay un grupo de F# entusiastas.

Me gustaría conocer mejor este idioma, así que, aparte de teoría de la programación funcional, ¿puede indicarme los mejores puntos de partida para empezar a utilizar el lenguaje F#?Quiero decir, tutoriales, how-tos, pero antes que nada muestras de trabajo para tener la oportunidad de empezar a hacer algo y disfrutar del idioma.

Muchas gracias

andrea

¿Fue útil?

Solución

No quiero prostituirme terriblemente, pero escribí un par de publicaciones de descripción general en F# en mi blog. aquí y aquí.Chris Smith (chico del equipo de F# en MS) tiene un artículo llamado 'F# en 20 minutos': parte 1 y parte 2.

Tenga en cuenta que debe tener cuidado ya que el último CTP de F# (versión 1.9.6.0) tiene algunos cambios importantes en comparación con las versiones anteriores, por lo que algunos ejemplos/tutoriales pueden no funcionar sin modificaciones.

Aquí hay un resumen rápido de algunas cosas interesantes, tal vez yo mismo pueda darle algunos consejos que son claramente muy breve y probablemente no sea excelente, ¡pero espero que te dé algo con qué jugar!:-

Primera nota: la mayoría de los ejemplos en Internet asumirán que la "sintaxis ligera" está activada.Para lograr esto, utilice la siguiente línea de código: –

#light

Esto evita que tenga que insertar ciertas palabras clave que están presentes para la compatibilidad con OCaml y también tener que terminar cada línea con punto y coma.Tenga en cuenta que usar esta sintaxis significa que la sangría define el alcance.Esto quedará claro en ejemplos posteriores, todos los cuales dependen de la activación de una sintaxis ligera.

Si está utilizando el modo interactivo, debe terminar todas las declaraciones con punto y coma doble, por ejemplo:

  > #light;;
  > let f x y = x + y;;

  val f : int -> int -> int

  > f 1 2;;
  val it : int = 3

Tenga en cuenta que el modo interactivo devuelve un resultado 'val' después de cada línea.Esto brinda información importante sobre las definiciones que estamos haciendo, por ejemplo 'val f :int -> int -> int' indica que una función que toma dos enteros devuelve un int.

Tenga en cuenta que solo en interactivo necesitamos terminar las líneas con punto y coma, cuando realmente definimos el código F# estamos libres de eso :-)

Las funciones se definen utilizando la palabra clave 'let'.Esta es probablemente la palabra clave más importante de todo F# y la usará mucho.Por ejemplo:-

let sumStuff x y = x + y
let sumStuffTuple (x, y) = x + y

Podemos llamar a estas funciones así: -

sumStuff 1 2
3
sumStuffTuple (1, 2)
3

Tenga en cuenta que hay dos formas diferentes de definir funciones aquí: puede separar los parámetros por espacios en blanco o especificar parámetros en 'tuplas' (es decir,valores entre paréntesis separados por comas).La diferencia es que podemos usar la 'aplicación de función parcial' para obtener funciones que toman menos de los parámetros requeridos usando el primer enfoque, y no con el segundo.P.ej.:-

let sumStuff1 = sumStuff 1
sumStuff 2
3

Tenga en cuenta que estamos obteniendo una función a partir de la expresión 'sumStuff 1'.Cuando podemos transmitir funciones con la misma facilidad que los datos que se denominan lenguajes que tienen "funciones de primera clase", esta es una parte fundamental de cualquier lenguaje funcional como F#.

La coincidencia de patrones es genial, es básicamente como una declaración de cambio con esteroides (sí, tomé esa frase de otro F#-ist :-).Puedes hacer cosas como: -

let someThing x =
  match x with
    | 0 -> "zero"
    | 1 -> "one"
    | 2 -> "two"
    | x when x < 0 -> "negative = " + x.ToString()
    | _ when x%2 = 0 -> "greater than two but even"
    | _ -> "greater than two but odd"

Tenga en cuenta que usamos el símbolo '_' cuando queremos hacer coincidir algo pero la expresión que devolvemos no depende de la entrada.

Podemos abreviar la coincidencia de patrones usando declaraciones if, elif y else según sea necesario: -

let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd"

Las listas de F# (que se implementan como listas vinculadas debajo) se pueden manipular de la siguiente manera:

let l1 = [1;2;3]
l1.[0]
1

let l2 = [1 .. 10]
List.length l2
10

let squares = [for i in 1..10 -> i * i]
squares
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]

let square x = x * x;;
let squares2 = List.map square [1..10]
squares2
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]

let evenSquares = List.filter (fun x -> x % 2 = 0) squares
evenSqares
[4; 16; 36; 64; 100]

Tenga en cuenta que la función List.map 'asigna' la función cuadrada a la lista del 1 al 10, es deciraplica la función a cada elemento.List.filter 'filtra' una lista devolviendo solo valores en la lista que pasan la función de predicado proporcionada.También tenga en cuenta la sintaxis 'fun x -> f': esta es la lambda F#.

Tenga en cuenta que no hemos definido ningún tipo: el compilador/intérprete de F# 'infiere' tipos, es decirCalcula lo que quieres del uso.Por ejemplo:-

let f x = "hi " + x

Aquí el compilador/intérprete determinará que x es una cadena ya que está realizando una operación que requiere que x sea una cadena.También determina que el tipo de retorno será una cadena.

Cuando hay ambigüedad, el compilador hace suposiciones, por ejemplo:

let f x y = x + y

Aquí xey podrían ser de varios tipos, pero el compilador por defecto es int.Si desea definir tipos, puede utilizar la anotación de tipo: -

let f (x:string) y = x + y

También tenga en cuenta que hemos tenido que encerrar x:string entre paréntesis, a menudo tenemos que hacer esto para separar partes de la definición de una función.

Dos operadores realmente útiles y muy utilizados en F# son los operadores de canalización directa y composición de funciones |> y >> respectivamente.

Definimos |> así:-

let (|>) x f = f x

Tenga en cuenta que puede definir operadores en F#, esto es genial :-).

Esto le permite escribir cosas de una manera más clara, por ejemplo:-

[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)

Te permitirá obtener los primeros 10 cuadrados pares.Eso es más claro que:-

List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10])

Bueno, al menos eso creo :-)

La composición de la función definida por el operador >> se define de la siguiente manera: -

let (>>) f g x = g(f(x))

Es decir.Al reenviar una operación, solo el parámetro de la primera función permanece sin especificar.Esto es útil ya que puede hacer lo siguiente: -

let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0)

Aquí mapFilter aceptará una lista y una entrada y devolverá la lista filtrada como antes.Es una versión abreviada de: -

let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)

Si queremos escribir funciones recursivas tenemos que definir la función como recursiva colocando 'rec' después de let.Ejemplos a continuación.

Algunas cosas interesantes: -

Factorial

let rec fact x = if x <= 1 then 1 else x * fact (x-1)

enésimo número de Fibonacci

let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2)

FizzBuzz

let (/%) x y = x % y = 0
let fb = function
  | x when x /% 15 -> "FizzBuzz"
  | x when x /% 3  -> "Fizz"
  | x when x /% 5  -> "Buzz"
  | x              -> x.ToString()

[1..100] |> List.map (fb >> printfn "%s")

De todos modos eso es un muy Breve descripción general, ¡espero que ayude un poco!

Otros consejos

Sin duda, deberías adquirir el excelente libro de Don Syme "Expert F#".El libro está muy bien escrito y es adecuado tanto para principiantes como para expertos.En él encontrará tanto material introductorio como material mucho más desafiante.Con casi 600 páginas tiene una buena relación calidad-precio.

Descubrí que me enseñó muchas técnicas útiles para escribir C# más funcional, además de proporcionarme todo el material de referencia que necesitaba para comenzar a escribir aplicaciones F# alojadas en Windows.

El libro es publicado por Apress y tiene un sitio web adjunto en:http://www.expert-fsharp.com/default.aspx

@kronoz: bueno, muchas gracias por tu larga respuesta, es un muy buen lugar para empezar.Seguiré tus consejos y buscaré el libro que mencionó @vecstasy.

ahora déjame seguir codificando :-)

let thanksalot = "thanks a lot"
printfn "%s" (thanksalot);;

He estado leyendo Programación funcional del mundo real

Con ejemplos en F# y C# por: Tomas Petricek

Hasta ahora lo encuentro muy bueno para enseñar conceptos de F# al mostrar las implementaciones en C# al costado.Ideal para programadores OO.

Revisar la Centro de desarrolladores de F#.También hay hubFS, un foro dedicado a F#.

Si tiene la versión CTP actual en Visual Studio, le permite crear un proyecto Tutorial de F#, que le proporciona un Tutorial.fs, que contiene exactamente lo que sugiere su nombre.

Ese tutorial también apunta a una colección más grande de Ejemplos de F# en Microsoft.

Además, hay un proyecto de muestras de F# en marcha en CódigoPlex.

Espero que esto ayude,

michiel

El primer capítulo de mi libro F# ​​for Scientists está disponible gratuitamente aquí.Disponemos de una serie de programas de juguetes F# gratuitos aquí.El primer artículo de nuestro F#.NET Journal está disponible gratuitamente aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top