Skip to content

Instantly share code, notes, and snippets.

@yamadapc
Created January 13, 2016 01:46
Show Gist options
  • Save yamadapc/da569e3cdd7b0439bc78 to your computer and use it in GitHub Desktop.
Save yamadapc/da569e3cdd7b0439bc78 to your computer and use it in GitHub Desktop.

Em Haskell, o equivalente a:

if let x = xOptional {
    // yada yada
}

Seria:

case maybeX of
    Just x -> fazCoisas -- yada yada
    Nothing -> return () -- Não faz nada

Acho que a diferença marcante entre essas duas estruturas é que em Haskell tudo é uma expressão. Efetivamente, eu posso ter:

let x = case maybeX of
    Just x -> x
    Nothing -> valorPadrao

Acontece que na prática, quando você tem um bloco do, você está programando de forma imperativa como no Swift. Então nada te impede de escrever algo tipo:

letOptional maybeX funcao = case maybeX of
    -- Se x estiver no maybe executa o bloco
    Just x -> funcao x
    -- Caso contrário não faz nada
    Nothing -> return ()

O que seria usado como:

main = do
    letOptional (Just 10) $ \x -> do
        print x -- 10
    letOptional Nothing $ \x -> do
        print "Não executo"
@yamadapc
Copy link
Author

O último bloco é exatamente:

func main() {
  let xOptional : Int? = 10
  let yOptional : Int? = nil

  if let x = xOptional {
    print(x)
  }

  if let y = yOptional {
    print("Não executo")
  }
}

main()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment