Usar a lógica condicional para criar vários caminhos de execução
Digamos que você tenha um programa que cria um arquivo de backup baseado nos arquivos em uma pasta. O programa consiste em poucas linhas de código que localizam e compactam um conjunto de arquivos. E se você quiser adicionar uma lógica que crie um arquivo de backup somente quando ainda não tiver sido feito nenhum backup no dia? O programa precisaria verificar essa condição (já foi feito um backup?) e depois fazer algo diferente se a condição for verdadeira (se um arquivo de backup do dia existir, não executar o backup).
Criar uma ramificação de código usando um constructo if
Um constructo if avalia uma expressão booliana. Se a expressão for avaliada como true, o programa executará um branch de código específico. A sintaxe de um constructo if é assim:
if <condition> then <expression>
Um exemplo de código mais tangível seria assim:
let age = 66
if age > 65
then printfn "Senior citizen"
Definir uma ramificação alternativa usando uma cláusula else
Quando uma instrução if for avaliada como false, use uma cláusula else com o constructo if para executar um branch de código diferente.
Veja como você pode usar uma cláusula else:
let age = 66
if age > 65
then printfn "Senior citizen"
else printfn "Citizen"
Usar um constructo If como uma expressão
Até agora, você viu como usar if e else para criar ramificações diferentes no código. Quando o código segue diferentes ramificações, ele produz resultados diferentes considerando se uma condição booliana é avaliada como true ou false. O que talvez você não saiba é que quando uma expressão é executada, um valor é produzido.
Se o código for escrito como este exemplo, o resultado ficará claro:
let age = 64
let message = if age > 65 then "Senior citizen" else "Citizen"
printfn "%s" message
Nesse caso, if e else funcionam mais como uma expressão ternária. Se uma condição for true, ela retornará esse valor. Se ela for false, ela retornará o outro valor. Em ambos os casos, um valor é retornado. Um fato que é verdadeiro para todas as expressões if.
Vamos relembrar um exemplo de código anterior e examinar os bastidores:
let age = 66
if age > 65 then printfn "Senior citizen" else printfn "Citizen"
É o mesmo exemplo de código que já vimos, mas agora, if e else estão na mesma linha. Como as ações importantes da operação printf ocorrem na função, a função não precisa retornar um valor real. Portanto, o valor retornado da expressão printfn "Senior citizen" produz um valor do tipo unit.
Observação
unit é um valor que atua como um espaço reservado quando nenhum valor real é retornado. Você pode considerá-lo como void ou None.
Outra informação que você precisa saber é que não é possível misturar tipos.
if e else precisam retornar o mesmo tipo de dados ou você receberá um erro. Por exemplo, não é possível escrever um código como este exemplo:
let someCondition = true
let value = if someCondition then "hello" else 1 // not allowed
Nesse caso, if determina que o tipo de retorno é string, portanto, else não pode alterar esse tipo para int. Para que o código anterior funcione, você precisa modificá-lo:
let someCondition = true
let value = if someCondition then "hello" else "1" // allowed
Usar um constructo elif
Até agora, você viu como if e else funcionam.
elif é outro constructo que você pode usar de modo semelhante ao uso do if. Assim como um constructo if, um constructo elif usa um valor booliano e deve ser adicionado logo após if. O constructo elif é executado quando a condição if é avaliada como false. Aqui está um exemplo de como usar o elif:
let cardValue = 1
let cardDescription = if cardValue = 1 then "Ace" elif cardValue = 14 then "Ace" else "A card"
printfn "%s" cardDescription