Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Debates
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mamcx Ver Mensaje
Otros combos interesantes para combinar con Delphi:

Haskell: http://learnyouahaskell.com/

Te quita el concepto de la programacion OO y te introduce a su opuesto natural: Programacion funcional
Y esto, ¿no es como un retroceso? ¿De qué va este haskell? ¿Es similar a lisp? ¿En qué áreas se usa?

// Saludos
Responder Con Cita
  #2  
Antiguo 19-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.917
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Y esto, ¿no es como un retroceso? ¿De qué va este haskell? ¿Es similar a lisp? ¿En qué áreas se usa?

// Saludos
Retroceso en que?

Algo que me tomo tiempo entender es que no existe una linea ascendete tipo:

Programacion Imperativa < Estructural < Objetos

Sino familias de lenguajes. Por lo tanto, no hay retroceso en pasar de una familia a otra (algo que hacemos todo el tiempo, por ejemplo al usar un lenguaje declarativo como SQL o HTML).

La programacion funcional es la OPUESTA a la orientada a objetos. En OO se tiende a enfatizar todo en el sustantivo, mientras en la funcional en el paso de datos.

La primera vez que entendi la diferencia fue leyendo:

http://steve-yegge.blogspot.com/2006...-of-nouns.html

P.D: Al igual que todo "estilo", la programacion funcional puede ser incorporada en otros lenguajes que son OO, y la OO se puede introducir en otros lenguajes no OO (como por ejemplo, cuando se simular OO en C).

Esto significa que no hay que sacrificar -del todo- la herramienta que conozco ahora, por una totalmente diferente.

Un ejemplo simple, en python (python es multi-paradigma: OO, procedural, funcional, imperativo):

Tradicional, imperativo (con efectos colaterales):
Código PHP:
amigos = ['a','b','c']

amigos.sort()

for 
amigo in amigos:
    print 
amigo.upper() 
Funcional (sin efectos colaterales):
Código PHP:
amigos = ['a','b','c']

[
amigo.upper() for amigo in sorted(amigos)] 
Una buena discusion de cuando se usa un estilo u otro:
http://stackoverflow.com/questions/2...ed-programming

La programacion funcional ha sido casi siempre un "nicho" oscuro, ppalmente porque sus proponentes son muy de la academia y meten una terminologia y casos de usos muy cienti/matematico/esoterico que es dificil de resonar con el programador promedio, pero ultimamente sus conceptos mas utiles se han ido pegando en varios lenguajes. Por ejemplo:

Soporte a Closure y funciones de primero orden

Uso de funciones anonimas / lambdas

Tambien han ido surgiendo lenguajes como F#, Scala, Clojure que tiene un punto de vista mas "normal" de la programacion funcional y que como corren sobre un runtime como .NET/Java permiten importar codigo OO.
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 19-09-2012
Avatar de Julián
Julián Julián is offline
Merodeador
 
Registrado: may 2003
Ubicación: en mi casa
Posts: 2.019
Poder: 10
Julián Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Código PHP:
amigos = ['a','b','c']

amigos.sort()

for 
amigo in amigos:
    print 
amigo.upper() 
Funcional (sin efectos colaterales):
Código PHP:
amigos = ['a','b','c']

[
amigo.upper() for amigo in sorted(amigos)] 

Y ¿Cuales son eso efectos colaterales?
Y por cierto, el segundo ejemplo parece mucho mas retorcido, en el peor sentido, que el de php.

Un saludo!
__________________
"la única iglesia que ilumina es la que arde"
Anonimo
Responder Con Cita
  #4  
Antiguo 19-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Julián Ver Mensaje
Y por cierto, el segundo ejemplo parece mucho mas retorcido, en el peor sentido, que el de php.
Me parece que ambos ejemplos están en python.

// Saludos
Responder Con Cita
  #5  
Antiguo 19-09-2012
maxi915 maxi915 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 63
Poder: 13
maxi915 Va por buen camino
ajam, todo muy bien, pero sigo sin saber las diferencias claves en los lenguajes ..muy buenos aportes de todas formas
Responder Con Cita
  #6  
Antiguo 19-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.917
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Julián Ver Mensaje
Y ¿Cuales son eso efectos colaterales?
http://docs.python.org/howto/functional.html

Cita:
In a functional program, input flows through a set of functions. Each function operates on its input and produces some output. Functional style discourages functions with side effects that modify internal state or make other changes that aren’t visible in the function’s return value. Functions that have no side effects at all are called purely functional. Avoiding side effects means not using data structures that get updated as a program runs; every function’s output must only depend on its input.
El efecto colateral es este: amigos.sort()

Supongamos que el codigo que puse (ambos son python, pongo etiqueta PHP por los colores, ya que no hay para python) fuera una funcion:

Código PHP:
def listarAmigos(amigos):
    
amigos.sort()

    for 
amigo in amigos:
        
yield amigo.upper()


amigos = ['b','a','c']

print list(
listarAmigos(amigos))
>> 
RESULTADO: ['A''B''C']
print 
amigos
>> RESULTADO: ['a''b''c'
Como ves, al invocar listarAmigos ocurrio un efecto colateral: La funcion altero los datos/objetos.

En la programacion funcional se busca que con la MISMA entrada ocurra EXACTAMENTE, SIEMPRE, la MISMA salida. Esto ayuda a que el programa sea mas confiable, correcto y sin sorpresas inesperadas.

O en otras palabras, se busca la inmutabilidad de los datos, y se prefiere retornar copias nuevas de los datos transformadas por funciones.

En forma funcional:

Código PHP:
def listarAmigos(amigos):
    for 
amigo in sorted(amigos):
        
yield amigo.upper()


amigos = ['b','a','c']

print list(
listarAmigos(amigos))
>> 
RESULTADO: ['A''B''C']
print 
amigos
>> RESULTADO: ['b''a''c'
No se altero la estructura inicial (amigos).

Los efectos colaterales son causas de muchos errores y dificultad en depurar los programas, porque en cualquier momento, una estructura cambia su significado e informacion al ir pasando de un lado al otro, y el manejo del estado se debe chequear manualmente (recordar que si paso un objeto mutable lo que envie me puede devolver algo inesperado).

Cita:
Functional programming can be considered the opposite of object-oriented programming. Objects are little capsules containing some internal state along with a collection of method calls that let you modify this state, and programs consist of making the right set of state changes. Functional programming wants to avoid state changes as much as possible and works with data flowing between functions. In Python you might combine the two approaches by writing functions that take and return instances representing objects in your application (e-mail messages, transactions, etc.).
Por lo tanto, se puede decir que OO es manipular maquinas de estado, donde cada "palanca" y "boton" representa un conjunto de datos y operaciones diferentes, mientras en funcional, cada funcion representa una transformacion de datos.

En OO se puede llegar a cosas raras como:

Código PHP:
class BD:
    
conexion = ...
    
esActivo false

    def open
(self):
        
self.conexion Conexion()
        
self.esActivo true

    def consulta
(selfsql):
        
#Esto es un error en potencia. El significado
        #de consulta depende de que previamente se abra
        #la conexion! Se debe colocar guardas
        
return self.conexion.ExeSql(sql)
        
#Ok, una guarda        
        
if self.esActivo:
            
#El colocar una guarda NO garantiza la ejecucion! El estado esta desconectado de los datos!
            
return self.conexion.ExeSql(sql)

bd = new BD()

bd.open()

#ERROR. No hay garantia del manejo de estado, sin 
#programacion cuidadosa
bd.conexion None

print bd.consulta("SELECT 1"
Este es un ejemplo de como los estados con efectos colaterales complican la programacion y generan potenciales errores.
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Programar .Net kman Varios 0 01-09-2006 03:49:08
Programar un telefono mauriciofox Internet 3 05-12-2004 22:11:16
Programar una PDA marcial Varios 5 02-10-2004 19:39:41
Programar con Paquetes PKG brandolin Varios 1 10-08-2004 03:37:08
Programar el puerto usb el toluca Varios 0 30-06-2004 20:33:17


La franja horaria es GMT +2. Ahora son las 02:30:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi