Una estructura de datos en Haskell o una clase en java o scala puede contener atributos esos atributos tienen un tipo determinado si ese tipo es igual a la clase contenedora tenemos una estructura recursiva.
Piensa en la lista en Haskell [5]. Es lo mismo que 5:[]. A la izquierda del : hay un valore, y a la derecha hay una lista. En este caso, una lista vacía. ¿Qué pasaría con la lista [4,5]? Bueno, es lo mismo que 4:(5:[]). Si miramos el primer :, vemos que también tiene un elemento a su izquierda y una lista a su derecha (5:[]). Lo mismo sucede para la lista 3:(4:(5:6:[])), que también podría escribirse como 3:4:5:6:[] (ya que : es asociativo por la derecha) o [3,4,5,6].
Podemos decir que una lista es o bien una lista vacia o bien un elemento unido con un : a otra lista (que puede ser una lista vacía o no).
Podemos usar los tipo de datos algebraicos para implementar nuestra propia lista:
data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord)
Se lee de la misma forma que se leía nuestra definición de lista en un párrafo anterior. Es o bien una lista vacía o bien una combinación de un elemento y otra lista. Si estás confundido con esto, quizás te sea más fácil entenderlo con la sintaxis de registro:
data List a = Empty | Cons { listHead :: a, listTail :: List a} deriving (Show, Read, Eq, Ord)
Puede que también estes confundido con el constructor Cons. Cons es otra forma de decir :. En realidad, en las listas, : es un constructor que toma un valor y otra lista y devuleve una lista. En otras palabras, tiene dos campos. Uno es del tipo a y otro es del tipo [a].
ghci> Empty
Empty
ghci> 5 `Cons` Empty
Cons 5 Empty
ghci> 4 `Cons` (5 `Cons` Empty)
Cons 4 (Cons 5 Empty)
ghci> 3 `Cons` (4 `Cons` (5 `Cons` Empty))
Cons 3 (Cons 4 (Cons 5 Empty))
Si hubiésemos llamado a nuestro constructor de forma infija podrías ver mejor como es simplemente :. Empty es como [] y 4 `Cons` (5 `Cons` Empty) es como 4:(5:[]).
Podemos definir funciones que automáticamente sean infijas si las nombramos únicamente con caracteres especiales. Podemos hacer lo mismo con los constructores, ya que son simplemente funciones que devuelve un tipo de dato concreto. Mira esto:
infixr 5 :-:
data List a = Empty | a :-: (List a) deriving (Show, Read, Eq, Ord)
Antes de nada, vemos que hay una nueva construcción sintáctica, una declaración infija. Cuando definimos funciones como operadores, podemos usar esta cosntrucción para darles un determinado comportamiento (aunque no estamos obligados a hacerlo). De esta forma definimos el orden de precedencia de un operador y si asociativo por la izquierda o por la derecha. Por ejemplo, * es infixl 7 * y + es infixl 6 +. Esto siginifica que ambos son asociativos por la izquierda de forma que (4 * 3 * 2) es (4 * 3) * 2) pero * tiene un orden de precedencia mayor que +, por lo que 5 * 4 + 3 es equivalente a (5 * 4) + 3.
De qualquier modo, al final acabamos escribiendo a :-: (List a) en lugar de `` Cons a (List a)``. Ahora podemos escribir las listas así:
ghci> 3 :-: 4 :-: 5 :-: Empty
(:-:) 3 ((:-:) 4 ((:-:) 5 Empty))
ghci> let a = 3 :-: 4 :-: 5 :-: Empty
ghci> 100 :-: a
(:-:) 100 ((:-:) 3 ((:-:) 4 ((:-:) 5 Empty)))
Haskell seguirá mostrando el constructor como una función prefija cuando derivemos Show, por este motivo aparecen los paréntesis alrededor del constructor (recuerda que 4 + 3 es igual que (+) 4 3).
Vamos a crear una función que una dos de nuestras listas. Así es como está definida la función ++ para listas normales:
infixr 5 ++
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
Así que copiamos esta definición y la aplicamos a nuestras listas:
infixr 5 .++
(.++) :: List a -> List a -> List a
Empty .++ ys = ys
(x :-: xs) .++ ys = x :-: (xs .++ ys)
Y así es como funciona:
ghci> let a = 3 :-: 4 :-: 5 :-: Empty
ghci> let b = 6 :-: 7 :-: Empty
ghci> a .++ b
(:-:) 3 ((:-:) 4 ((:-:) 5 ((:-:) 6 ((:-:) 7 Empty))))
Fíjate que hemos utilizado un ajuste de patrón (x :-: xs). Esto función ya que el ajuste de patrones en realidad funciona ajustando constructores. Podemos ajustar un patrón :-: porque es un constructor de nuestro tipo de la misma forma que : es un constructor de las listas estándar. Lo mismo sucede para [].
Ya que el ajuste de patrones funciona (solo) con constructores de datos, podemos ajustar patrones como los constructores prefijos normales, constructores infijos o cosas como 8 o 'a', que al fin y al cabo son constructores de tipos numéricos y caracteres.
Translate
sábado, 18 de octubre de 2014
Tutorial de Ceylon
Si quieres aprender Ceylon rápidamente este tutorial es para vos : http://lmauzaize.developpez.com/tutoriels/ceylon/typage/
jueves, 16 de octubre de 2014
Standard ML
Estoy haciendo el curso de corsera sobre lenguajes de programación y en este curso se estudia Standard ML y madre mía ,que lenguaje!!! Y obvio despertó mi curiosidad, veamos que nos dice la wikipedia sobre SML:
"El lenguaje de programación Standard ML o SML es un lenguaje descendiente del lenguaje ML que nació como el Meta Lenguaje del sistema LCF. A diferencia de muchos otros lenguajes de programación, SML tiene una especificación formal, como semántica operacional publicada en el libro The Definition of Standard ML."
Yo ya hable de SML en otro post pero mi inconstancia, no dejo que profundice. Seguramente estas pensando que me puede aportar este lenguaje? Que lo hace especial?
Como primer punto es un lenguaje funcional y es de tipado estático, con genéricos. A la vez el compilador infiere los tipos por lo que tiene el sistema de tipos más simple y mejor diseñado que he usado, y si no mira:
- val i = 2
val i = 2 : int
- val miLista = [1,1,3,4,5]
val miLista = [1,1,3,4,5] : int list
- val otraLista = [miLista, [1,2,8]]
val otraLista = [[1,1,3,4,5],[1,2,8]] : int list list
- val unString="unString"
val unString = "unString" : string
Si ven otraLista es de tipo list y es genérica. Y este genérico es de tipo lista de enteros, en java sería así:
List<List<Integer>>
Al ser un lenguaje funcional las funciones son lo más importante, y se definen de la siguiente manera:
- fun sumar (a:int, b:int):int = a + b
val sumar = fn : int * int -> int
- sumar (4, 5)
val it = 9 : int
"El lenguaje de programación Standard ML o SML es un lenguaje descendiente del lenguaje ML que nació como el Meta Lenguaje del sistema LCF. A diferencia de muchos otros lenguajes de programación, SML tiene una especificación formal, como semántica operacional publicada en el libro The Definition of Standard ML."
Yo ya hable de SML en otro post pero mi inconstancia, no dejo que profundice. Seguramente estas pensando que me puede aportar este lenguaje? Que lo hace especial?
Como primer punto es un lenguaje funcional y es de tipado estático, con genéricos. A la vez el compilador infiere los tipos por lo que tiene el sistema de tipos más simple y mejor diseñado que he usado, y si no mira:
- val i = 2
val i = 2 : int
- val miLista = [1,1,3,4,5]
val miLista = [1,1,3,4,5] : int list
- val otraLista = [miLista, [1,2,8]]
val otraLista = [[1,1,3,4,5],[1,2,8]] : int list list
- val unString="unString"
val unString = "unString" : string
Si ven otraLista es de tipo list y es genérica. Y este genérico es de tipo lista de enteros, en java sería así:
List<List<Integer>>
Al ser un lenguaje funcional las funciones son lo más importante, y se definen de la siguiente manera:
- fun sumar (a:int, b:int):int = a + b
val sumar = fn : int * int -> int
- sumar (4, 5)
val it = 9 : int
Como ven la función sumar es de tipo int * int -> int , lo que significa que tiene dos parámetros enteros y devuelve un entero.
Otro tipo interesante son las tuplas, son colecciones de elementos de un mismo tipo que se pueden acceder por un indice, similar a los arreglos:
- fun sumarTupla(tupla: int * int) : int = #1 tupla + #2 tupla
val sumarTupla = fn : int * int -> int
- sumarTupla((1,2))
val it = 3 : int
SML es un lenguaje que tiene un sistema de tipos muy simple, voy a seguir postiando cosas interesantes sobre el lenguaje.
sábado, 11 de octubre de 2014
Que lenguaje deben enseñar en la facultad y cual no? y porque?
Es bueno que la facultad enseñe los lenguajes más utilizados? Debe enseñar conceptos y no lenguajes?
En mi opinión la facultad no debería preocuparse si el lenguaje se utiliza o no en el mercado, es más mejor si enseña uno que no usa nadie, así el alumno tiene que aprender otros y por su cuenta.
Por favor comenten que piensan!!
Ruby vs. The World
Quiero compartir con ustedes este muy interesante video y presentación que compara o habla de diferentes lenguajes modernos.
Dejo link: http://matt.aimonetti.net/posts/2012/11/02/rubyconf-2012-ruby-vs-the-world/
Dejo link: http://matt.aimonetti.net/posts/2012/11/02/rubyconf-2012-ruby-vs-the-world/
miércoles, 8 de octubre de 2014
The Linux Foundation Certification Program
Todo comenzó con un curso en EDX y ahora linux foundation no solo nos regala un curso, sino que también nos permite certificarnos como sysadmin o engineer.
Dejo el link: http://training.linuxfoundation.org/certification/
Multiple Dispatch
Quiero recomendarles el siguiente articulo "Multiple Dispatch" si estan interesados en que es el double Dispach y por que es interesado.
sábado, 4 de octubre de 2014
ExpressionBuilder
Cuando realizamos Unit test necesitamos crear componentes o objetos para testear, no se puede
mockear todo. Una muy buena idea es construir nuestros objetos con builders. A la vez podemos reutilizar estos builder en diferentes tests.
mockear todo. Una muy buena idea es construir nuestros objetos con builders. A la vez podemos reutilizar estos builder en diferentes tests.
Una idea muy buena son los ExpressionBuilders, que son builders que simulan un DSL para construir objetos. Es muy Elegante:
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
Esto se logra haciendo que el builder contenga la instancia que debe construir y cada vez que se llama a with o otro método que setea la instancia, devolvemos this, para poder encadenar los llamados.
Queda de esta forma:
public class OrderBuilder {
private Order subject = new Order();
private OrderLine currentLine;
public OrderBuilder with(int quantity, String productCode) {
currentLine = new OrderLine(quantity, Product.find(productCode));
subject.addLine(currentLine);
return this;
}
public OrderBuilder skippable() {
currentLine.setSkippable(true);
return this;
}
public OrderBuilder priorityRush() {
subject.setRush(true);
return this;
}
public Order getSubject() {
return subject;
}
}
Por supuesto que esta técnica no solo se puede utilizar en unit test...
jueves, 2 de octubre de 2014
MySQL ofrece una API REST
Si, si, MySQL ofrece una API REST. Toma tu torta! leyendo infoQ me encontré con la noticia de que existe un plugin, para agregar una API REST, este plugin se encuentra en MySql labs.
Esta API nos permite acceder a nuestra información por medio de REST. De hecho lo que hacemos es hacer una consulta con una url:
SQL: SELECT * FROM simple ORDER BY id
URL: http://127.0.0.1:8080/sql//SELECT+%2A+FROM+simple+ORDER+BY+id
Además se puede hacer CRUD, y se puede utilizar JSON.
Dejo link: http://www.infoq.com/news/2014/09/MySQL-REST
Esta API nos permite acceder a nuestra información por medio de REST. De hecho lo que hacemos es hacer una consulta con una url:
SQL: SELECT * FROM simple ORDER BY id
URL: http://127.0.0.1:8080/sql//SELECT+%2A+FROM+simple+ORDER+BY+id
Además se puede hacer CRUD, y se puede utilizar JSON.
Dejo link: http://www.infoq.com/news/2014/09/MySQL-REST
miércoles, 1 de octubre de 2014
Ceylon roadmap
Charan charan !! Ceylon 1.0 ha sido liberado!!
Y el equipo de Ceylon sigue trabajando, la versión 1.1 va a estar centrada en mejoras de rendimiento e interoperabilidad y la versión 1.2 añadirá nuevas características del lenguaje.
A prestar atención!!
Dejo link:
http://ceylon-lang.org/documentation/1.0/roadmap/
domingo, 28 de septiembre de 2014
sábado, 27 de septiembre de 2014
PureScript, un lenguaje que lleva la programación funcional al browser
PureScript es un lenguaje similar a Haskell que compila a javascript, por lo que puede ser ejecutado por un browser y interactuar con una pagina web.
PureScript fue creado por Phil Freeman, quien se inspiro en Haskell para hacer este lenguaje. El cual nos trae de Haskell las siguientes características:
PureScript fue creado por Phil Freeman, quien se inspiro en Haskell para hacer este lenguaje. El cual nos trae de Haskell las siguientes características:
- Inferencia de tipos.
- Higher Kinded Polymorphism, no supe como traducirlo, pero sería un mecanismo de abstracción sobre constructores.
- Pattern matching
- Type Classes: tan poco me conversia la traducción, un mecanismo de abstracción sobre las estructuras de datos que permite utilizarlos sin tener que pensar directamente en la estructura de los datos en sí.
El código esta en github y es de licencia MIT.
Dejo link:
miércoles, 24 de septiembre de 2014
Soporte nativo para Json en java 9?
Al parecer en Java 9 vamos a tener soporte nativo para JSon. Es decir que vamos a poder utilizar una Api nativa para procesar Json.
Históricamente, Java ha sido una plataforma de elección para el procesamiento de XML, pero en los últimos años el mundo se ha movido más y más hacia los datos JSON siendo consumida y devuelta por los servicios web basados en REST simples. Java ha bajado un poco detrás de la curva de otros lenguajes, y es este déficit que JEP 198 espera abordar.
Dejo link: http://www.infoq.com/news/2014/09/CoreJSONJava9
Históricamente, Java ha sido una plataforma de elección para el procesamiento de XML, pero en los últimos años el mundo se ha movido más y más hacia los datos JSON siendo consumida y devuelta por los servicios web basados en REST simples. Java ha bajado un poco detrás de la curva de otros lenguajes, y es este déficit que JEP 198 espera abordar.
Dejo link: http://www.infoq.com/news/2014/09/CoreJSONJava9
domingo, 21 de septiembre de 2014
Primeros pasos en Qt: Qt Designer
Qt designer es una herramienta pensada para el diseño de interfaces de forma cómoda y fácil.
Una de las ventajas de la utilización de Qt Designer es que permite a los programadores una gran libertad para modificar sus diseños sin ser forzados a cambiar su código fuente. Al desarrollar escribiendo solo código C++, los cambios en el diseño pueden llevar mucho tiempo. Con Qt Designer, no se pierde tiempo, simplemente regenera el código fuente que ha cambiado.
Las Interfaz de usuario (ventanas) se guarda en un archivo .ui (un formato de archivo basado en XML), mientras que la funcionalidad personalizada se implementa mediante subclases.
Supongamos que debamos acceder a cualquier componente que hemos diseñado desde el diseñar. Debemos llamarlos desde un objeto generado, que se construye en el constructor y es de igual tipo que la ventana, no estoy siendo muy claro, veamos un poco de código para expresarme mejor:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ui->pushButton->setText("Chau!!");
}
En el ejemplo para acceder a pushButton tuvimos que utilizar el objeto ui que es la ventana.
Aprendiendo Ruby on Rails 4.0
Sin preámbulos, quiero compartir el libro con ustedes, si bien el libro no esta terminado es totalmente gratuito y en español. Por lo tanto suscribanse!!
Dejo un extracto:
"Conoce como desarrollar aplicaciones web con un enfoque de afuera hacia adentro - Outside-in - con el marco de trabajo de Ruby on Rails 4.0.
Aprender de la naturalidad de un languaje de programación como Ruby y de cómo Ruby on Rails 4.0 explota nuestra productividad."
Dejo link:
http://railsenespanol.co/
Dejo un extracto:
"Conoce como desarrollar aplicaciones web con un enfoque de afuera hacia adentro - Outside-in - con el marco de trabajo de Ruby on Rails 4.0.
Aprender de la naturalidad de un languaje de programación como Ruby y de cómo Ruby on Rails 4.0 explota nuestra productividad."
Dejo link:
http://railsenespanol.co/
Suscribirse a:
Entradas (Atom)