Post on 14-Feb-2016
description
F#Alejandro Hidalgo FernándezMiguel Caballero PintoRafael Campos Godoy
.NETF#
Orientado a
Objetos
Imperativo
Funcional
F#Su creador fue Don Syme (MSR Cambridge,
UK)
Características de F#• Conciso• Fuertemente Tipado• Inferido como ML• Scripting interactivo como Python• Portable• Concurrente• Orientado a objetos• Plataforma .NET
F#El origen se encuentra en Ocaml y HaskellEditor
• Visual Studio
• Editor• Consola
Compilador
• Todas los CLI
• Intermediate Language
F# Aplicaciones realesCTP Septiembre 2008
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
¿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
Sintaxis de F#• Literales• Tuplas• Identificadores (let)• Funciones• Funciones anónimas• Recursión• Operadores
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• ...
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
F# vs Haskell
Comparativa
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
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)
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
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.
¿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.
F# vs Haskell:Rendimiento
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)
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)
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)
F# vs HaskellFactorial
fact 1000 fact 5000 fact 10000 fact 143500
500
1000
1500
2000
2500
3000
3500
4000
Haskell (ms)F# (ms)
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)
F# vs Haskell:Rendimiento
• ¿Y si compilamos Haskell?− Utilizaremos el compilador ghc
− Glasgow Haskell Compiler− main +RTS –sstderr
• F# es un lenguaje interpretado
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)
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)
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)
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)
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)