elm provee el if tradicional :
if x < 0 then "too small" else "ok"
"ok" : String
Similar al if de Ruby o al case de otros lengujes podemos escribir lo siguiente :
> x = 5
5 : number
> if | x < 0 -> "too small" \
| | x > 0 -> "too big" \
| | otherwise -> "just right"
"too big" : String
La barra invertida es porque estoy usando el RELP y tengo que avisarle de los enteres que no tienen sentido
Este if es muy similar a pattern matchinig pero Elm tiene pattern matching :
> list = [1, 2, 3]
[1,2,3] : [number]
> case list of \
| head::tail -> tail \
| [] -> []
[2,3] : [number]
Esta sentencia devuelve el final de una lista, si existe, las vacia, de otro modo. Se puede ver el uso de pattern matching.
La belleza y el poder de un sistema de tipos se ve cuando constrimos nuestros propios tipos de datos complejos. Veamos un ejemplo, una pieza de ajedrez tiene un tipo y un color. Lo que podemos hacer es lo siguiente :
> type Color = Black | White
> type Piece = Pawn | Knight | Bishop | Rook | Queen | King
> type ChessPiece = CP Color Piece
> piece = CP Black Queen
CP Black Queen : ChessPiece
Un constructor de tipos nos permite construir nuevas instancias de un tipo. Nuestro tipo ChessPiece consta de los caracteres CP, nuestro constructor de tipos, seguido de un Color y una Pieza. Ahora, podemos usar la combinación de mayúsculas y minúsculas para separar la pieza, así:
> color = case piece of \
| CP White _ -> White \
| CP Black _ -> Black
Black : Color
type List = Nil | Cons Int List
Esta es una definición recursiva, una lista es una lista vacia o una construcción de un elemento y una lista.
Ese tipo de datos es interesante, pero podemos hacerlo mejor. Podemos definir una lista abstracta, una que pueda contener cualquier tipo de datos, como este:
type List a = Empty | Cons a (List a)
Es igual que la definición anterior pero con tipo generico a.
Si desea saber cómo se evalúa una lista en Elm, observe el tipo de datos. Puede representar el tipo para la lista [1, 2] como Cons 1 (Cons 2 Empty).
Ahora, cuando te digo que puedes combinar el encabezado de una lista con la cola, tiene sentido. Cons funciona en tipos en tiempo de compilación. La contraparte en tiempo de ejecución del operador Cons que trabaja con datos es ::, y funciona así :
> 1 :: 2 :: 3 :: []
[1,2,3] : [number]
Por ahora vamos bien, pero seguimos en otro post...