Translate

domingo, 8 de marzo de 2020

HTML + javascript + Haskell = ELM, parte 3

Seguimos con el post anteriro.

Construimos tipos para el color y la pieza, y eso estuvo bien perooooooo nuestro ejemplo de ajedrez se volvió un poco más complicado cuando queríamos extraer el color. Lo que realmente necesitamos es una forma de acceder a los campos con nombre. Esa cosa es un registro, y es un compañero natural para los objetos de JavaScript. Digamos que queremos representar una pieza de ajedrez con los campos Color y Pieza:

> blackQueen = {color=Black, piece=Queen}
{ color = Black, piece = Queen } : { color : Repl.Color, piece : Repl.Piece }
> blackQueen.color
Black : Repl.Color
> blackQueen.piece
Queen : Repl.Piece

El Repl. es solo un alcance para los tipos, y el . es forma que llamamos a color es en realidad una función:

> .color blackQueen
Black : Repl.Color

Ahora, podemos acceder a los componentes de nuestro tipo estructurado. Al igual que con muchos lenguajes funcionales, los registros son inmutables, pero podemos crear uno nuevo con campos actualizados, o incluso campos cambiados, como este:

> whiteQueen = { blackQueen | color <- White }
{ color = White, piece = Queen } : { piece : Repl.Piece, color : Repl.Color }
> position = { column = "d", row = 1 }
{ column = "d", row = 1 } : {column : String, row : number}
> homeWhiteQueen = { whiteQueen | position = position }
{ color = White, piece = Queen, position = { column = "d", row = 1 } }
: { piece : Repl.Piece
, color : Repl.Color
, position : { column : String, row : number }
}
> colorAndPosition = { homeWhiteQueen - piece }
{ color = White, position = { column = "d", row = 1 } }
: { color : Repl.Color, position : { column : String, row : number }
}
> colorAndPosition.color
White : Repl.Color

Creamos tres nuevos registros, todos de diferentes tipos, transformando nuestro registro original. 

Por ahora vamos bien, pero seguimos en otro post...