Skip to content

elc117/apresentacao-bim1-2025b-HLKellermann

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 

Repository files navigation

TUPLAS

_EM HASKELL_

DEFINIÇÃO:

Em Haskell, uma tupla é um “mecanismo” para construir dados compostos. Isto é, uma forma de combinar os componentes de um dado em uma estrutura só, podendo eles serem de tipos diferentes.

SINTAXE:

  • Entre parênteses, com seus componentes separados por vírgula:
  • (elemento1, elemento2, elemento3, elementoN)
  • Também podemos escrever dessa forma um pouco incomum:
  • (,) elemento1 elemento2
  • Sintaxe de tupla de tipos segue o mesmo padrão da primeira imagem de sintaxe:
  • (Int, Int, Float, String, Int)

ESPECIFICANDO:

  • Sequência finita de n elementos: tem um tamanho/número fixo de elementos que a compõe;
  • Estrutura estática: após criá-la, não é possível modificá-la. Boa para dados que devem ser imutáveis;
  • Heterogênea: contém um ou mais tipos diferentes;
  • Elementos representados na ordem dada, podendo ter o mesmo elemento mais de uma vez;
  • --TUPLAS COM n ELEMENTOS:
    
    --Tupla-2/Pairs:
    (87669544, "Nome completo")
    
    --Tupla-3/Triples:
    (87669544, "Nome completo", 'M')
    
    --Tupla-5:
    (87669544, "Nome completo", 'M', "dd/mm/aaaa", 1.71)
  • Não há limite para os tipos que são associados as tuplas, ex: uma tupla de tupla;
--Exemplos de tuplas:

([Int], String, (Char, Int))
([1, 2, 3], "hello", ('A'), 65))

(Int, (Int, (Int, Int,), Int), Int)
(1, (2, (3, 4), 5), 6)

OBSERVAÇÕES:

  • Tuplas com apenas um componente não tem sentido;
  • Tipos Unit podem ser entendidos como Tuplas-0, pois sua escrita é ();
  • Não há funções pré-definidas para tuplas de mais de 2 elementos, mas podemos criar nossas próprias;
  • Mas há também libraries e packages de tuplas que podem ser usadas, como as do site hackage.haskell.org:
  • Package/tuple

    Data.Tuple.Select

    GitHub

  • *Em certos casos, talvez seja melhor optar por criar um tipo de dado do que usar tuplas.

USO:

Tem uso para os casos de que se deseja definir uma função ao qual recebe ou retorna mais de um valor, sendo normalmente de tipos heterogêneos. É interessante para coordenadas, parâmetros conectores de base de dados e chave de dicionários. No Caso abaixo, a função verIdade recebe uma tupla de dois elementos de diferentes e retorna apenas a idade:
type Nome = String    --Sinônimo para String(Nome)
type Idade = Int      --Sinônimo para Int(Idade)

verIdade :: (Nome,Idade) -> Idade   --Função que se passa uma tupla
verIdade (a,b) = b                  --(Nome, Idade), e devolve a idade

FUNÇÕES RELACIONADAS:

De Prelude ou Data.Tuple:
  • FST: Retorna o primeiro valor de uma tupla-2;
  • fst (1,2)  --retorna 1
  • SND: Retorna o segundo valor de uma tupla-2;
  • snd (1,2)  --retorna 2

    *As duas acima podem ser usadas combinadas juntas ou com outras funções:

    snd (fst ((True,4), "Bom) )  --retorna 4
    map fst [(1,2), (3,4), (5,6)]    --retorna [1,3,5]
  • CURRY: converte uma função que recebe tuplas em uma que recebe 2 argumentos:
  • Image
  • UNCURRY: converte função de argumentos em função de tuplas
  • Image
  • ZIP: transforma duas listas em uma lista de tuplas:
  • Image
  • SWAP: troca os elementos de um par:
  • Image ou: Image
  • *Pattern Matching:
  • Usa os construtores da tupla. Pode-se usar esse método para tuplas maiores: Image

OUTROS EXEMPLOS E PROGRAMAS COM TUPLAS

Ex1:
Image
Ex2:
Image Image
Ex3:
Image

_EM OUTRAS LINGUAGENS_

Podemos encontrar tuplas em outras linguagens, como em Python, C++, SQL, Rust, etc. Vejamos:

PYTHON

  • Sua definição é assim como a em Haskell e as demais. Também podem vir a serem chamadas de containers ou collections, e em alguns casos, a escrita da tupla pode ser da forma convencional, ou a sem parênteses:
  • #SINTAXE:
    tupla = (1, 2, 3)
    #OU
    tupla = 1, 2, 3
  • Elementos dentro de uma tupla são acessados usando indexação:
  • #INDEXAÇÃO DE ELEMENTOS:
    
    #Primeiro:  tupla[O]
    #Segundo:  tupla[1]
    #...
    #Penúltimo:  tupla[-2]
    #Últimpo:  tupla[-1]

    *Tentar acessar um índice inexistente na tupla, obviamente, gerará um erro.

  • Um elemento solitário precisa ser definido da seguinte forma para ser diferenciado de um valor comum:
  • apenasUm = (7,)
  • Uma tupla vazia é representada da seguinte forma:
  • empty = ()
    #()
  • Usando com strings:
  • #Forma correta
    "Hello, %s! You're %s years old." % ("Linda, 24)
    'Hello, Linda! You're 24 years old'
    
    #Forma incorreta:
    "Hello, %s! You're %s years old." % "Linda, 24
    Traceback (most recent call last):
      ...
    TypeError: not enough arguments for format string

    FUNÇÕES:

  • SLICING: extrair uma faixa de elementos da tupla usando: tuple[start:end:step]
  • ``` start: inclusivo; end: exclusivo; step/stride: especifica o incremento entre componentes. ```

    Ex1:

    image

    Ex2:

    image

    Ex3:

    image
  • CONCATENAÇÃO: concatena duas tuplas
  • image
  • REPETIÇÃO: repete a tupla n vezes
  • image
  • LEN: acha o número de elementos em uma tupla.
  • image
  • ZIP:
  • image

    C++

  • Criar uma tupla
  • #include <tuple>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        tuple<int, bool, string> t1 {7, false, "Beleza?"};
        // CTAD - Class template argument deduction
        tuple t2 {8, true, "CTAD"s};
        cout << "t1 = (" << get<0>(t1) << ", " << get<1>(t1) << ", " << get<2>(t1) << ")" << endl;
        cout << "t2 = (" << get<0>(t2) << ", " << get<1>(t2) << ", " << get<2>(t2) << ")" << endl;
    }
    
    /*SAÍDA
    t1=(7, 0, Beleza?)
    t2 = (8, 1, CTAD)
    */
  • Tipo de um elemento
  • #include <tuple>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        tuple<int, bool, string> t1 {7, false, "Beleza?"};
        
        cout << "Tipo do primeiro elemento de t1: " << typeid(get<0>(t1)).name() << endl;
        cout << "Tipo do segundo elemento de t1: " << typeid(tuple_element<1, decltype(t1)>::type).name() << endl;
        cout << "Tipo do terceiro elemento de t1: " << typeid(tuple_element<2, decltype(t1)>::type).name() << endl;
    }
    
    /*SAÍDA
    Tipo do primeiro elemento de t1: i
    Tipo do segundo elemento de t1: b
    Tipo do terceiro elemento de t1: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
    */
  • Tamanho de uma tupla std::tuple_size
  • #include <tuple>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        tuple<char, double, string> t1 {'a', 10.5, "Beleza?"};
        
        cout << "Tamanho da tupla t1: " << tuple_size<decltype(t1)>::value << endl;
        cout << "Tamanho da tupla t1: " << tuple_size<tuple<char, double, string>>::value << endl;
    }
    /*SAÍDA
    Tamanho da tupla t1: 3
    Tamanho da tupla t1: 3
    */

    SQL

    As tables em SQL também são basicamente sets de tuplas, podendo usar colunas de tuplas ou tuplas de valores constantes.

    --ex1:
    INSERT (id, nome, idade, salario) VALUES (1, "joão", 25, 1000.00);
    
    --ex2:
    SELECT * FROM sometable
    WHERE (col1, col2, col3) = (1, 2, "abc");

    RUST

    // Declare tuple
    let tupleName: (i32, bool) = (0, false);
    
    // Types can be inferred
    let tupleName = (0, false);
    
    // Deconstructive assignment
    let (value, value2) = tupleName; // value/value2 now hold the tuple's first/second value

    _GHCI_

  • Exemplo 1: Converter real para dólar e euro

  • Ex1

    --valores das moedas no dia 26/08/2025
    converter real = (real, real*5.41, real*6.29)
  • Exemplo 2: Informações de um livro

  • Ex2

    type Livro = (String, String, Int)
    l1::Livro = ("", "", ) --dê um nome para sua variável e adicione os dados da tupla
  • Exemplo 3: Filtra os resultados maiores que 2

  • Ex3

maior x = x>2
filter maior (map (uncurry (+))) [(,), (,), (,), (,), (,)]) --complete como quiser

_FONTES_

https://www.facom.ufu.br/~madriana/PF/Haskell3.pdf

https://www.inf.ufpr.br/andrey/ci062/ProgramacaoHaskell.pdf

https://aterribili.blogspot.com/2014/01/haskell-apresentando-tuplas.html

https://haskell.tailorfontela.com.br/syntax-in-functions

https://wiki.haskell.org/Haskell_em_10_minutos

https://devtut.github.io/haskell/tuples-pairs-triples.html#pattern-match-on-tuples

https://www.quora.com/Is-Python-the-only-programming-language-that-uses-the-concept-of-a-tuple

https://www.quora.com/Which-programming-languages-have-tuples

https://haskell.pesquisa.ufabc.edu.br/haskell/03.haskell.basico.1/

https://www.facom.ufu.br/~madriana/PF/pratica01.pdf

https://realpython.com/python-tuple/#getting-started-with-pythons-tuple-data-type

https://www.dataquest.io/blog/python-tuples/

https://github.com/Malpaux/programming-cheat-sheets/blob/master/rust.md#data-structures

https://cppmoderno.com/o-que-e-tupla-em-cpp/

https://pt.stackoverflow.com/questions/164164/tuplas-em-banco-de-dados

https://books.google.com.au/books?id=6yupzA8JZjQC&pg=PA390&lpg=PA390&dq=touch%20of%20class%20tuples&source=bl&ots=dqDA9wcvlw&sig=ACfU3U01q8096Fi3d1z7kQq1YtqFVBpWjQ&hl=en&sa=X&ved=2ahUKEwiD4Zq0p5jiAhWTjeYKHY_gBDkQ6AEwAHoECAkQAQ#v=onepage&q=tuple&f=false

About

apresentacao-bim1-2025b-HLKellermann created by GitHub Classroom

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published