Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

28
F# Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

description

F#. Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy. F#. Su creador fue Don Syme (MSR Cambridge, UK). .NET. Características de F#. Conciso Fuertemente Tipado Inferido como ML Scripting interactivo como Python Portable Concurrente Orientado a objetos - PowerPoint PPT Presentation

Transcript of Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Page 1: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F#Alejandro Hidalgo FernándezMiguel Caballero PintoRafael Campos Godoy

Page 2: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

.NETF#

Orientado a

Objetos

Imperativo

Funcional

F#Su creador fue Don Syme (MSR Cambridge,

UK)

Page 3: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Características de F#• Conciso• Fuertemente Tipado• Inferido como ML• Scripting interactivo como Python• Portable• Concurrente• Orientado a objetos• Plataforma .NET

Page 4: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F#El origen se encuentra en Ocaml y HaskellEditor

• Visual Studio

• Editor• Consola

Compilador

• Todas los CLI

• Intermediate Language

Page 5: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# Aplicaciones realesCTP Septiembre 2008

Page 6: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F#. Preguntas a Don Syme¿Próxima release?¿Código compartido?¿Estará F# en .NET 4.0?¿Será F# el OCaml para .NET?

Programación orientada a objetosProgramación reflexivaComputación de expresiones

¿Seguirá MS Research trabajando sobre F#?Cambridge, Redmon, Vancouver, China, Alemania y New York

Page 7: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

¿Qué aporta F# a .Net?Ejemplo:

Una aplicación que analiza millones de feedbacks. Es sistema lee los datos desde una BD SQL Server y escribe los resultados en un fichero de Matlab.

C#1000 líneas aprox.

~ 2 días

Page 8: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Sintaxis de F#• Literales• Tuplas• Identificadores (let)• Funciones• Funciones anónimas• Recursión• Operadores

Page 9: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Programación ImperativaF# contiene recursos de la programación imperativa, añadiendo cambios de estado:

• Tipos• Registros • Llamadas a métodos estáticos • Creación de objetos • Control de flujo• Eventos• ...

Page 10: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Programación OOEl objetivo es encapsular la implementación y el estado. Conseguimos una mejor estructura del programa.

Tenemos herencia, muy útil al trabajar con GUIs

F# tiene:− Interfaces− Casting− Clases

Page 11: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell

Comparativa

Page 12: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellF#• No es puramente

funcional• Ejecución perezosa

solo de forma explícita

• Disponibilidad de todas las librerías del Framework .NET

• Más amigable para un programador imperativo

• Integración con Visual Studio

Haskell• Puramente

funcional• Ejecución perezosa• Posibilidad de

descargar multitud de librerías de Internet

• Curva de aprendizaje más inclinada

• Multitud de editores

Page 13: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell: SintaxisF#• Uso de palabra

clave let para asignar valores a símbolos:

let rec fact = function

| 0 -> 1 | n -> n * fact(n - 1)

Haskell• No es necesario

introducir ninguna palabra clave para asignar valores a símbolos:

fact n | n == 0 = 1 | otherwise = n * fact

(n-1)

Page 14: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Comparación de patronesF#• Uso match …

with • No permite

emparejar patrones en la definición de la función.

Haskell• Sin palabras

claves• Empareja

patrones en la definición de la función

Page 15: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Evaluación perezosaF#• Evaluación perezosa

desactivada por defecto.

• Uso de lazy para evaluación perezosa.

• Las listas no permiten evaluación perezosa.− Uso de Seq− Construcción de

listas infinitas usando unfold.

Haskell• Evaluación

perezosa activada por defecto.

• Uso del operador $! para forzar la evaluación.

• Las listas trabajan de forma nativa con evaluación perezosa.

Page 16: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

¿Código imperativo?F#• F# permite código

imperativo (al estilo de C#).

• Permite el uso de variables (let mutable).

• Efectos laterales llamando a funciones .NET o a funciones auxiliares de F# como print_any.

Haskell• Haskell es un

lenguaje puramente funcional: no permite código imperativo.

• Al asociar un valor a un símbolo este permanece inmutable.

• Efectos laterales mediante mónadas.

Page 17: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell:Rendimiento

Page 18: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellFibonacci

fib 10 fib 15 fib 20 fib 25 fib 300

1000

2000

3000

4000

5000

6000

7000

8000

9000

10000

Haskell (ms)F# (ms)

Page 19: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellFibonacci (recursión de cola)

fibCola 100 fibCola 1000 fibCola 5000 fibCola 10000 fibCola 150000

20

40

60

80

100

120

Haskell (ms)F# (ms)

Page 20: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellFibonacci (sobre listas)

fibList 5000 fibList 10000 fibList 15000 fibList 20000 fibList 225000

100

200

300

400

500

600

Haskell (ms)F# (ms)

Page 21: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellFactorial

fact 1000 fact 5000 fact 10000 fact 143500

500

1000

1500

2000

2500

3000

3500

4000

Haskell (ms)F# (ms)

Page 22: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs HaskellQuicksort (lista aleatoria)

qsort r 1000 qsort r 10000 qsort r 25000 qsort r 50000 qsort r 700000

2000

4000

6000

8000

10000

12000

Haskell (ms)F# (ms)

Page 23: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell:Rendimiento

• ¿Y si compilamos Haskell?− Utilizaremos el compilador ghc

− Glasgow Haskell Compiler− main +RTS –sstderr

• F# es un lenguaje interpretado

Page 24: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell (compilado)Fibonacci

fib 10 fib 15 fib 20 fib 25 fib 30 fib 350

1000

2000

3000

4000

5000

6000

7000

8000

9000

10000

F# (ms)ghc(ms)

Page 25: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell (compilado)Fibonacci (recursión de cola)

fibCola 100 fibCola 1000 fibCola 5000 fibCola 10000 fibCola 150000

5

10

15

20

25

30

35

40

45

F# (ms)ghc(ms)

Page 26: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell (compilado)Fibonacci (sobre listas)

fibList 5000 fibList 10000 fibList 15000 fibList 20000 fibList 225000

10

20

30

40

50

60

70

80

90

F# (ms)ghc(ms)

Page 27: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

F# vs Haskell (compilado)Quicksort (lista aleatoria)

qsort r 1000 qsort r 10000 qsort r 25000 qsort r 50000 qsort r 700000

200

400

600

800

1000

1200

1400

1600

1800

2000

F# (ms)ghc(ms)

Page 28: Alejandro Hidalgo Fernández Miguel Caballero Pinto Rafael Campos Godoy

Conclusiones comparativa

• GHC otorga un rendimiento óptimo en aplicaciones funcionales.

• F# permite una fácil integración en cualquier tipo de aplicación.

• Winhugs nos ofrece un entorno de desarrollo amigable.

Haskell (I) Haskell (C) F#

Rendimiento

Pobre Muy bueno Bueno

Depuración

Fácil Media Muy fácil

Interfaz GUI (Winhugs)

Consola GUI (VS)