Uso de lógica condicional para crear varias rutas de ejecución

Completado

Supongamos que tenemos un programa que crea un archivo de copia de seguridad en función de los archivos de una carpeta. El programa consta de unas cuantas líneas de código que localizan y comprimen un conjunto de archivos. ¿Qué ocurre si decidimos que queremos agregar lógica según la cual solamente se creará un archivo de copia de seguridad cuando no se haya hecho una copia de seguridad ese día? El programa necesitará una forma de comprobar esa condición (¿se ha hecho ya una copia de seguridad?) y de hacer algo diferente en función de si la condición se cumple (si ya hay un archivo de copia de seguridad de ese día, no se hace ninguna copia de seguridad).

Crear una rama de código mediante una construcción if

Una construcción if evalúa una expresión booleana. Si la expresión se evalúa como true, el programa ejecuta una rama de código concreta. Este es el aspecto de la sintaxis de una construcción if:

if <condition> then <expression>

Este es otro ejemplo que muestra un código más obvio:

let age = 66
if age > 65 
then printfn "Senior citizen"

Definir una rama alternativa mediante una cláusula else

Cuando una instrucción if se evalúa como false, use una cláusula else con la construcción if para ejecutar una rama de código diferente.

Aquí se muestra cómo usar una cláusula else:

let age = 66
if age > 65 
then printfn "Senior citizen"
else printfn "Citizen"

Usar una construcción if como una expresión

Hasta el momento, hemos visto cómo usar if y else para crear diferentes ramas en el código. Cuando el código sigue diversas ramas, genera resultados diferentes en función de si una condición booleana se evalúa como true o como false. Lo que tal vez no haya tenido en cuenta, es que cuando una expresión se ejecuta, se genera un valor.

Si el código se escribe como en este ejemplo, el resultado queda patente:

let age = 64
let message = if age > 65 then "Senior citizen" else "Citizen"
printfn "%s" message

En este caso, if y else funcionan más como una expresión ternaria. Si una condición es true, devuelve un valor. Si es false, devuelve el otro valor. En cualquier caso, se devolverá un valor. Esto se aplica a todas las expresiones if.

Volvamos a ver un ejemplo de código anterior y profundicemos:

let age = 66
if age > 65 then printfn "Senior citizen" else printfn "Citizen"

Se trata del mismo ejemplo de código que vimos antes, si bien ahora if y else están en la misma línea. Dado que las acciones importantes de la operación printf se producen en la función, esta no tiene que devolver un valor real. Por lo tanto, el valor devuelto de la expresión printfn "Senior citizen" genera un valor de tipo unit.

Nota:

unit es un valor que actúa como marcador de posición cuando no se devuelve ningún valor real. Puede pensar en él como void o None.

Otro aspecto que ha de tenerse en cuenta es que no se pueden combinar tipos. if y else deben devolver el mismo tipo de datos, o se producirá un error. Por ejemplo, no se puede escribir código como el del siguiente ejemplo:

let someCondition = true
let value = if someCondition then "hello" else 1 // not allowed

En este caso, if determina que el tipo de valor devuelto es string, de modo que else no puede cambiar ese tipo a int. Para que el código anterior funcione, deberemos modificarlo:

let someCondition = true
let value = if someCondition then "hello" else "1" // allowed

Usar una construcción elif

Hasta ahora, hemos visto cómo funcionan if y else. elif es otra construcción que podemos usar de forma similar a if. Al igual que una construcción if, la construcción elif toma un valor booleano que se debe agregar justo después de if. La construcción elif se ejecuta cuando la condición if evalúa como false. Este es un ejemplo de cómo usar elif:

let cardValue = 1
let cardDescription = if cardValue = 1 then "Ace" elif cardValue = 14 then "Ace" else "A card"
printfn "%s" cardDescription