2008-08-30 5 views
18

Parece que aquí en StackOveflow hay un grupo de F # entusiastas.Lenguaje F # - sugerencias para los novatos

Me gustaría saber mejor este idioma, así que, aparte del functional programming theory, ¿me puede indicar los mejores puntos de partida para comenzar a usar el lenguaje F #? Quiero decir, tutoriales, instrucciones, pero antes que nada ejemplos de trabajo para tener la oportunidad de comenzar a hacer algo y disfrutar el idioma.

Muchas gracias

Andrea

Respuesta

30

No a mí puta horrible pero me escribió un par de mensajes # F visión general sobre mi blog here y here. Chris Smith (hombre en el equipo F # en MS) tiene un artículo llamado 'F # en 20 minutos' - part 1 y part 2.

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

Aquí hay una rápida decadencia de algunas cosas interesantes, tal vez pueda dar algunos consejos aquí a mí mismo que son claramente muy breve y, probablemente, no es muy bueno, pero espero que le da algo para jugar con: -

Primera nota: la mayoría de los ejemplos en Internet supondrán que la "sintaxis ligera" está activada. Para lograr este uso la siguiente línea de código: -

#light 

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

Si está utilizando el modo interactivo que tiene que poner fin a todas las declaraciones con doble punto y coma, 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 proporciona información importante sobre las definiciones que estamos haciendo, por ejemplo 'val f: int -> int -> int' indica que una función que toma dos ints devuelve un int.

Tenga en cuenta que sólo en interactiva Qué necesitamos para terminar líneas con puntos y comas, cuando en realidad la definición de F # código que están libres de ese :-)

Se definen las funciones utilizando la palabra clave 'dejar'. Esta es probablemente la palabra clave más importante en 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 de este modo: -

sumStuff 1 2 
3 
sumStuffTuple (1, 2) 
3 

Nota que hay dos maneras diferentes de definir las funciones aquí - Puede parámetros separados 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. Por ejemplo:

let sumStuff1 = sumStuff 1 
sumStuff 2 
3 

Tenga en cuenta que estamos obteniendo una función de la expresión 'sumStuff 1'. Cuando podemos pasar las funciones tan fácilmente como los datos a los que se hace referencia como el lenguaje que tiene 'funciones de primera clase', esta es una parte fundamental de cualquier lenguaje funcional como F #.

La coincidencia de patrones es bastante genial, es básicamente como una declaración de interruptor con esteroides (sí, corté esa frase de otro F # -ist :-). Puede 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" 

Nota usamos el '_' símbolo cuando queremos hacer coincidir en algo más que la expresión que vamos a volver, no depende de la entrada.

Podemos abreviar coincidencia de patrones utilizando si, elif y else según sea necesario: -

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

F # listas (que se implementan como listas enlazadas por debajo) puede ser manipulado por lo tanto: -

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 'mapea' la función cuadrada en la lista del 1 al 10, es decir, aplica la función a cada elemento. List.filter 'filtra' una lista solo devolviendo valores en la lista que pasan la función de predicado provista. También tenga en cuenta la sintaxis 'diversión x -> f' - esta es la F # lambda.

Tenga en cuenta que a lo largo de todo el proceso no hemos definido ningún tipo - el compilador F #/intérprete 'infiere' tipos, es decir, resuelve lo que quiere del uso. Por ejemplo: -

let f x = "hi " + x 

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

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

let f x y = x + y 

Aquí X e Y pueden ser varios tipos, pero los valores por defecto del compilador a int.Si desea definir tipos que puede utilizando tipo de anotación: -

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

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

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

Definimos |> así: -

let (|>) x f = f x 

Tenga en cuenta que puede definir operadores en C#, esto es bastante fresca :-).

Esto le permite escribir cosas de una manera más clara, e.g.:-

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

Se permitirá obtener los primeros 10 incluso cuadrados. Esto es más claro que: -

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

Bueno, al menos yo creo que sí :-)

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, reenvía 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 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 que tenemos que definir la función recursiva como mediante la colocación de 'REC' después de la 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 una breve descripción muy, espero que ayude un poco !!

5

Sin duda, debe comprar 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ás tanto material introductorio como material mucho más desafiante también. En 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, así como para proporcionar todo el material de referencia que necesitaba para comenzar a escribir aplicaciones F # alojadas en Windows.

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

5

@kronoz - bueno muchas gracias por su larga respuesta, ese es un muy buen lugar para comenzar. Seguiré tus consejos y buscaré el libro @vecstasy mencionado.

ahora, déjame ir codificación :-)

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

upvoted puramente debido al código de agradecimiento. hoo-yah! – AruniRC

1

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

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

Además, hay un proyecto F # samples en el CodePlex.

Espero que esto ayude,

Michiel

2

He estado leyendo Real World Functional Programming

con ejemplos en C# y C# por: Tomas Petricek

Hasta ahora me resulta muy bueno en la enseñanza F # conceptos mostrando las implementaciones en C# en el lado. Ideal para programadores OO.

1

El primer capítulo de mi libro F # for Scientists está disponible gratuitamente here. Tenemos una serie de programas gratuitos de juguete F # here. El primer artículo de nuestro F # .NET Journal está disponible gratuitamente en here.

Cuestiones relacionadas