Tuplas

Las tuplas son agregados ordenados de (unos muy pocos) datos, posiblemente de distinto tipo, que en algunos casos son más convenientes que definir records.

let messi = ("Messi",10)
let paredes = ("Paredes",5)

En este caso definimos una tupla donde la primer componente es de tipo string, mientras que la segunda componente es de tipo int.

Se pueden extraer la primer o segunda componente para el caso de tuplas de dos elementos a través de las funciones fst y snd.

let nombreMessi = fst messi 
let numeroMessi = snd messi

printfn "%s juega con la casaca %A" nombreMessi numeroMessi
Messi juega con la casaca 10

Para tuplas de más elementos, cada uno de ellos puede extraerse con una variante de pattern matching:

let cookies = ("Opera", 200, 4.15)
let choco = ("Wonka", 35, 12.40) 

let operaName, operaWeight, operaPrice = cookies 

printfn "El producto %s pesa %d y cuesta %f" operaName operaWeight operaPrice
El producto Opera pesa 200 y cuesta 4.150000

Si uno está interesado en sólo uno de los componentes, se puede usar _ como comodín:

let _,_,chocoPrice = choco

printfn "El chocolate Wonka cuesta %f $" chocoPrice
El chocolate Wonka cuesta 12.400000 $

En los dos ejemplos anteriores el uso de los paréntesis ( y ) es opcional.

Así como es posible hacer pattern matching para controlar el flujo del código con distintas condiciones, también es posible utilizar tuplas.

let isExpensive product = 
    match product with 
    | (brand,_,price) when price > 10.0 -> 
        printfn "%A is Expensive!" brand 
    | _ -> 
        let (brand,_,_) = product
        printfn "%A is cheap" brand 

cookies |> isExpensive 
choco |> isExpensive 
"Opera" is cheap
"Wonka" is Expensive!

Hay que recordar que las tuplas es otro tipo de dato, así que se puede mezclar con records, uniones, etc. Se pueden definir tipos de datos a partir de tuplas:

type Point = 
    | Point of float * float

let xOf p = 
    let (Point (x,_)) = p
    x
let yOf p = 
    let (Point (_,y)) = p
    y
let p = Point (2,3)

printfn "la coordenada x de p es %A" (xOf p)
printfn "la coordenada y de p es %A" (yOf p)

la coordenada x de p es 2.0
la coordenada y de p es 3.0

Y las tuplas podrían contener otros tipos de datos, como tuplas de tuplas:

type Segment =  Point * Point

type Triangle = Point * Point * Point 

let lengthOf segment =
    let  (p1,p2) = segment 
    let sx = xOf p1 - xOf p2 
    let sy = yOf p1 - yOf p2 
    sqrt (sx*sx + sy*sy)


let s =  (Point (1,4), Point (2,5))
printfn "%A" (lengthOf s)
1.414213562

results matching ""

    No results matching ""