Hace mucho que no posteo sobre el amigo C# y la verdad es que estoy algo oxidado... Pero me intereso este articulo y se merecia un post.
El paradigma de programación funcional fue creado explícitamente para la resolución de problemas con enfoque matemático puro. La programación funcional es una forma de programación declarativa. En cambio, la mayoría de los lenguajes convencionales, incluidos los lenguajes de programación orientada a objetos (OOP) como C #, Visual Basic, C ++ y Java, fueron diseñados principalmente para soportar la programación imperativa (de procedimiento).
En la programación orientada a objetos tradicional (OOP), la mayoría de los desarrolladores están acostumbrados a la programación en el estilo imperativo / procedimental. Para cambiar al desarrollo en un estilo funcional puro, tienen que hacer una transición en su pensamiento y su acercamiento al desarrollo.
Para resolver problemas, los desarrolladores de OOP diseñan jerarquías de clases, se enfocan en la encapsulación apropiada y piensan en términos de contratos de clases. El comportamiento y el estado de los tipos de objetos son primordiales, y se proporcionan características del lenguaje, como clases, interfaces, herencia y polimorfismo, para abordar estas preocupaciones.
Por el contrario, la programación funcional aborda los problemas computacionales como un ejercicio de evaluación de las transformaciones funcionales puras de las colecciones de datos. La programación funcional evita los datos de estado y mutables, y en su lugar enfatiza la aplicación de funciones.
Afortunadamente, C # no requiere el salto completo a la programación funcional, ya que soporta los enfoques de programación tanto imperativos como funcionales. Un desarrollador puede elegir qué enfoque es el más apropiado para un escenario en particular. De hecho, los programas a menudo combinan ambos enfoques.
Dejo link:
https://msdn.microsoft.com/en-us/library/mt693186.aspx
Translate
lunes, 30 de enero de 2017
sábado, 28 de enero de 2017
Que lenguaje de programación fue el que más popular en el 2016?
Según el índice TIOPE : Go!
Si el lenguaje de google sigue creciendo y se lleva la distinción del lenguaje más popular.
La pagina de tiope dice lo siguiente (más o menos) :
TIOBE recompensa el lenguaje de programación que ha ganado la mayor popularidad en un año con el premio de lenguaje de programación del año. Sin prácticamente ninguna competencia Go ha ganado el premio para el año 2016. El lenguaje google Go ganó con un 2,16% en un año. Seguido de Dart (+ 0.95%) y Perl (+ 0.91%). Los principales impulsores del éxito de Go son su facilidad de aprendizaje y naturaleza pragmática. No se trata de conceptos teóricos como la herencia virtual y las mónadas, sino la experiencia práctica. Aparte de eso, Go incorpora soporte para la programación en paralelo. por lo que cada vez más clientes de nuestra empresa TIOBE están adoptando Go en un entorno industrial. Es un buen indicador.
Personalmente opino que no es bueno que un lenguaje triunfe solo por pragmático, claramente en los conceptos podemos desarrollarnos. Pero solo una opinion personal.
Bueno que más decir, felicitaciones Go!
Dejo link: http://www.tiobe.com/tiobe-index/?imm_mid=0ec6d0&cmp=em-prog-na-na-newsltr_20170121
Si el lenguaje de google sigue creciendo y se lleva la distinción del lenguaje más popular.
La pagina de tiope dice lo siguiente (más o menos) :
TIOBE recompensa el lenguaje de programación que ha ganado la mayor popularidad en un año con el premio de lenguaje de programación del año. Sin prácticamente ninguna competencia Go ha ganado el premio para el año 2016. El lenguaje google Go ganó con un 2,16% en un año. Seguido de Dart (+ 0.95%) y Perl (+ 0.91%). Los principales impulsores del éxito de Go son su facilidad de aprendizaje y naturaleza pragmática. No se trata de conceptos teóricos como la herencia virtual y las mónadas, sino la experiencia práctica. Aparte de eso, Go incorpora soporte para la programación en paralelo. por lo que cada vez más clientes de nuestra empresa TIOBE están adoptando Go en un entorno industrial. Es un buen indicador.
Personalmente opino que no es bueno que un lenguaje triunfe solo por pragmático, claramente en los conceptos podemos desarrollarnos. Pero solo una opinion personal.
Bueno que más decir, felicitaciones Go!
Dejo link: http://www.tiobe.com/tiobe-index/?imm_mid=0ec6d0&cmp=em-prog-na-na-newsltr_20170121
sábado, 21 de enero de 2017
Scala by the pictures
Quiero compartir una pagina que esta muy buena, y se pueden ver buenas infografias de Scala.
Dejo link:
http://sciabarra.com/book/
martes, 17 de enero de 2017
Libro Aprendiendo Ruby on Rails 5 - Capítulo 6 disponible
Me llego este mail y lo comparto para todos los que quieran aprender Ruby:
| |||||||||||||||||||||||||||||
|
domingo, 15 de enero de 2017
Que lenguajes de programación son usados por cada compañía?
Yo creo que esto ya lo publique, pero bueno, el publico se renueva.
Dejo el link: http://www.improgrammer.net/the-programming-language-used-by-the-company/
Un resumen de Scala for the Impatient, parte 7
Procedimientos.
Los procedimientos en Scala retornan el tipo Unit y tienen una especial notación sin el =
def box(s : String) { // Look carefully: no =
val border = "-" * s.length + "--\n"
println(border + "|" + s + "|\n" + border)
}
Algunas personas no les gusta esta notación por lo que eligen utilizar la misma que las funciones:
def box(s : String): Unit = {
...
}
Lazy Values
Cuando un valor es declarado como lazy el calculo de este valor se realiza cuando se necesita, no antes:
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
De esta manera, si words no es utilizado el archivo nunca se abrirá.
Lazy values es útil para retrasar declaraciones de inicialización costosas. También pueden solucionar otros problemas de inicialización, como las dependencias circulares. Además, son esenciales para desarrollar estructuras de datos perezosas como Streams.
val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es definido
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es usado
def words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa cada vez que es usado
Exceptions
Las excepciones funcionan igual que C++ o Java. Cuando se lanza una excepción, por ejemplo:
throw new IllegalArgumentException("x should not be negative")
Se anula la ejecución y el sistema de ejecución busca un manejador de excepciones que puede manejar la excepción IllegalArgumentException. Si esta es manejada se reanuda la ejecución donde es manejado, si no existe un manejador, el programa finaliza. Igual a java.
Como en Java, las excepciones que se lanzan deben ser una subclase de java.lang.Throwable. Sin embargo, a diferencia de Java, Scala no tiene excepciones "verificadas o chequeadas" es decir que nunca se debe declarar una función o un método que lanza una excepción.
Una expresión throw retornan el tipo especial Nothing. Esto es útil en las expresiones if / else. Si una rama tiene el tipo Nothing, el tipo de la expresión if / else es el tipo de la otra rama. Por ejemplo, considere:
if (x >= 0) { sqrt(x)
} else throw new IllegalArgumentException("x should not be negative")
Esta expresión retornara Double, dado que el else retorna Nothing.
La expresión try puede utilizar pattern matching:
try {
process(new URL("http://horstmann.com/fred-tiny.gif"))
} catch {
case _: MalformedURLException => println("Bad URL: " + url)
case ex: IOException => ex.printStackTrace()
}
Cuando no necesitamos las variables podemos utilizar el _ (guión bajo)
La instrucción try / finally le permite disponer de un recurso independientemente de que se haya producido o no una excepción. Por ejemplo:
var in = new URL("http://horstmann.com/fred.gif").openStream()
try {
process(in)
} finally {
in.close()
}
La cláusula finally se ejecuta independientemente de si la función de proceso lanza una excepción. La variable in siempre cerrara el recurso.
Este código es un poco sutil, y plantea varios problemas.
Note que try / catch y try / finally tienen objetivos complementarios. La sentencia try / catch maneja las excepciones, y la sentencia try / finally toma alguna acción (normalmente cleanup) cuando no se maneja una excepción. Es posible combinarlas en una sola instrucción try / catch / finally:
try { ... } catch { ... } finally { ... }
Los procedimientos en Scala retornan el tipo Unit y tienen una especial notación sin el =
def box(s : String) { // Look carefully: no =
val border = "-" * s.length + "--\n"
println(border + "|" + s + "|\n" + border)
}
Algunas personas no les gusta esta notación por lo que eligen utilizar la misma que las funciones:
def box(s : String): Unit = {
...
}
Lazy Values
Cuando un valor es declarado como lazy el calculo de este valor se realiza cuando se necesita, no antes:
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
De esta manera, si words no es utilizado el archivo nunca se abrirá.
Lazy values es útil para retrasar declaraciones de inicialización costosas. También pueden solucionar otros problemas de inicialización, como las dependencias circulares. Además, son esenciales para desarrollar estructuras de datos perezosas como Streams.
val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es definido
lazy val words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa en el momento que es usado
def words = scala.io.Source.fromFile("/usr/share/dict/words").mkString
// Se evalúa cada vez que es usado
Exceptions
Las excepciones funcionan igual que C++ o Java. Cuando se lanza una excepción, por ejemplo:
throw new IllegalArgumentException("x should not be negative")
Se anula la ejecución y el sistema de ejecución busca un manejador de excepciones que puede manejar la excepción IllegalArgumentException. Si esta es manejada se reanuda la ejecución donde es manejado, si no existe un manejador, el programa finaliza. Igual a java.
Como en Java, las excepciones que se lanzan deben ser una subclase de java.lang.Throwable. Sin embargo, a diferencia de Java, Scala no tiene excepciones "verificadas o chequeadas" es decir que nunca se debe declarar una función o un método que lanza una excepción.
Una expresión throw retornan el tipo especial Nothing. Esto es útil en las expresiones if / else. Si una rama tiene el tipo Nothing, el tipo de la expresión if / else es el tipo de la otra rama. Por ejemplo, considere:
if (x >= 0) { sqrt(x)
} else throw new IllegalArgumentException("x should not be negative")
Esta expresión retornara Double, dado que el else retorna Nothing.
La expresión try puede utilizar pattern matching:
try {
process(new URL("http://horstmann.com/fred-tiny.gif"))
} catch {
case _: MalformedURLException => println("Bad URL: " + url)
case ex: IOException => ex.printStackTrace()
}
Cuando no necesitamos las variables podemos utilizar el _ (guión bajo)
La instrucción try / finally le permite disponer de un recurso independientemente de que se haya producido o no una excepción. Por ejemplo:
var in = new URL("http://horstmann.com/fred.gif").openStream()
try {
process(in)
} finally {
in.close()
}
La cláusula finally se ejecuta independientemente de si la función de proceso lanza una excepción. La variable in siempre cerrara el recurso.
Este código es un poco sutil, y plantea varios problemas.
- ¿Qué pasa si el constructor de URL o el método openStream lanza una excepción? Entonces el bloque try nunca se ingresa, y tampoco es la cláusula finally. Por lo tanto nunca se inicializara.
- ¿Por qué no es val in = nueva URL (...). OpenStream () dentro del bloque try? Entonces el alcance de en no se extendería a la cláusula final.
- ¿Qué pasa si in.close () lanza una excepción? Entonces esa excepción es expulsada de la declaración, reemplazando cualquier anterior. (Esto es igual que en Java, y no es muy agradable.) Idealmente, la antigua excepción permanecería unida a la nueva.
Note que try / catch y try / finally tienen objetivos complementarios. La sentencia try / catch maneja las excepciones, y la sentencia try / finally toma alguna acción (normalmente cleanup) cuando no se maneja una excepción. Es posible combinarlas en una sola instrucción try / catch / finally:
try { ... } catch { ... } finally { ... }
miércoles, 11 de enero de 2017
Codeschool lanza un nuevo curso de PHP
Codeschool viene con todo y cada vez más amplia sus tecnologías, ahora nos ofrece un curso de PHP:
|
|
Los Programadores Andan Diciendo
Me reí muchísimo con este grupo en facebook, por lo que lo comparto:
https://www.facebook.com/ProgramadoresAndanDiciendo/?pnref=story
https://www.facebook.com/ProgramadoresAndanDiciendo/?pnref=story
lunes, 9 de enero de 2017
Un resumen de Scala for the Impatient, parte 6
Funciones.
Scala tiene funciones además de métodos. La diferencia es que las funciones no pertenecen a ningún objeto.
Para definir una función solo es necesario, nombre, parámetros y el cuerpo de la función:
def abs(x: Double) = if (x >= 0) x else -x
No es necesario definir el tipo, dado que el compilador lo infiere. En el caso que no pueda inferirlo como funciones recursivas, se le debe indicar.
Si la función debe hacer varias cosas se puede utilizar las llaves:
def fac(n : Int) = {
var r = 1
for (i <- 1 to n) r = r * i
r
}
La función retorna lo ultimo que se ejecuta y no es necesario la palabra return.
Se pueden utilizar valores por defecto para las funciones:
def decorate(str: String, left: String = "[", right: String = "]") =
left + str + right
Si llamamos a decorate("Hello") , el resultado va a ser : "[Hello]"
Si llamamos a decorate("Hello", ">>>[") el resultado va a ser : ">>>[Hello]", pero, ¿como podemos llamar a la función con un parámetro para rigth y el default para left? con los parámetros nombrados:
decorate("Hello", right = "]<<<") // Calls decorate("Hello", "[", "]<<<")
Podemos nombrar todos los parámetros:
decorate(left = "<<<", str = "Hello", right = ">>>")
El resultado es "<<<Hello>>>" . Note que el orden de los parámetros no eran iguales que como fueron definidos.
Algunas veces es necesario implementar funciones con un numero variable de parametros, esto se hace con el * :
def sum(args: Int*) = {
var result = 0
for (arg <- args) result += arg
result
}
Y esto se puede llamar de la siguiente manera:
val s = sum(1, 4, 9, 16, 25)
La función recibe un parámetro de tipo Seq pero no podemos pasar una sequencia desde una función por ejemplo esto retornara error:
val s = sum(1 to 5) // Error
Si la función es llamada con un solo argumento este debe ser entero y no rango de enteros, para solucionar este problema se debe agregar _* :
val s = sum(1 to 5: _*) // Consider 1 to 5 as an argument sequence
Si necesitamos llamar a una función recursiva podemos utilizar el mismo artilugio:
def sum(args: Int*) : Int = {
if (args.length == 0) 0
else args.head + recursiveSum(args.tail : _*)
}
jueves, 5 de enero de 2017
Top 10 del contenido de InfoQ en el 2016
Me llego un mail muy interesante de infocola o InfoQ, sobre los temas más leídos en el 2016.
Como yo, seguro que se te paso alguno. Por lo que comparto con vos este mail:
Como yo, seguro que se te paso alguno. Por lo que comparto con vos este mail:
|
|
Suscribirse a:
Entradas (Atom)