{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Despacho múltiplo\n", "\n", "Neste notebook, vamos explorar o conceito de [despacho múltiplo](https://en.wikipedia.org/wiki/Multiple_dispatch), que é um recurso chave da linguagem Julia.\n", "\n", "Para entender despacho múltiplo em Julia, vamos começar com um exemplo que nós já vimos.\n", "\n", "Em Julia, podemos declarar funções sem informar o tipo dos argumentos da função.\n", "Por exemplo:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "f (generic function with 1 method)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(x) = x^2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Então a Julia vai determinar automaticamente sobre quais tipos de argumentos faz sentido aplicar a função, e sobre quais tipos não faz:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "81" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(9)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "MethodError: no method matching ^(::Vector{Int64}, ::Int64)\n\u001b[0mClosest candidates are:\n\u001b[0m ^(\u001b[91m::Union{AbstractChar, AbstractString}\u001b[39m, ::Integer) at strings/basic.jl:730\n\u001b[0m ^(\u001b[91m::Complex{<:AbstractFloat}\u001b[39m, ::Integer) at complex.jl:860\n\u001b[0m ^(\u001b[91m::Complex{<:Integer}\u001b[39m, ::Integer) at complex.jl:862\n\u001b[0m ...", "output_type": "error", "traceback": [ "MethodError: no method matching ^(::Vector{Int64}, ::Int64)\n\u001b[0mClosest candidates are:\n\u001b[0m ^(\u001b[91m::Union{AbstractChar, AbstractString}\u001b[39m, ::Integer) at strings/basic.jl:730\n\u001b[0m ^(\u001b[91m::Complex{<:AbstractFloat}\u001b[39m, ::Integer) at complex.jl:860\n\u001b[0m ^(\u001b[91m::Complex{<:Integer}\u001b[39m, ::Integer) at complex.jl:862\n\u001b[0m ...", "", "Stacktrace:", " [1] literal_pow", " @ ./intfuncs.jl:340 [inlined]", " [2] f(x::Vector{Int64})", " @ Main ./In[1]:1", " [3] top-level scope", " @ In[3]:1", " [4] eval", " @ ./boot.jl:368 [inlined]", " [5] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)", " @ Base ./loading.jl:1428" ] } ], "source": [ "f([1, 2, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Especificando os tipos dos argumentos\n", "\n", "Temos a opção de declarar explicitamente quais tipos de argumentos uma função pode receber.\n", "Por exemplo, vamos definir uma função `teste` que só pode receber argumentos do tipo `String`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "teste (generic function with 1 method)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "teste(x::String, y::String) = println(\"Os argumentos x e y são strings\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos verificar que a função `teste` age sobre strings, mas não age sobre argumentos de outros tipos:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Os argumentos x e y são strings\n" ] } ], "source": [ "teste(\"despacho\", \"múltiplo\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "LoadError", "evalue": "MethodError: no method matching teste(::Int64, ::Int64)", "output_type": "error", "traceback": [ "MethodError: no method matching teste(::Int64, ::Int64)", "", "Stacktrace:", " [1] top-level scope", " @ In[6]:1", " [2] eval", " @ ./boot.jl:368 [inlined]", " [3] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)", " @ Base ./loading.jl:1428" ] } ], "source": [ "teste(2, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para fazer com que a função `teste` aceite números inteiros, vamos definir `teste` para argumentos do tipo `Int`:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "teste (generic function with 2 methods)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "teste(x::Int, y::Int) = println(\"Os argumentos x e y são números inteiros\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Os argumentos x e y são números inteiros\n" ] } ], "source": [ "teste(2, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora `teste` age sobre os inteiros.\n", "Mas observe, a função `teste` continua definida quando `x` e `y` são strings:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Os argumentos x e y são strings\n" ] } ], "source": [ "teste(\"despacho\", \"múltiplo\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quando declaramos\n", "```julia\n", "teste(x::Int, y::Int) = println(\"Os argumentos x e y são números inteiros\"),\n", "```\n", "não removemos ou substituímos\n", "```julia\n", "teste(x::String, y::String),\n", "```\n", "simplesmente adicionamos um método à função genérica `teste`.\n", "\n", "Uma **função genérica** é um conceito abstrato associado a uma operação.\n", "Por exemplo, a função genérica `+` representa o conceito de adição.\n", "Um **método** é uma implementação específica de uma função genérica para um tipo específico de argumento.\n", "Por exemplo, a função `+` possui métodos para números de precisão flutuante, inteiros, matrizes, etc.\n", "Podemos usar `methods` para ver os métodos que a função `teste` possui:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "# 2 methods for generic function teste:" ], "text/plain": [ "# 2 methods for generic function \"teste\":\n", "[1] teste(x::String, y::String) in Main at In[4]:1\n", "[2] teste(x::Int64, y::Int64) in Main at In[7]:1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods(teste)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "E podemos ver os métodos da função `+`:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "# 206 methods for generic function +:" ], "text/plain": [ "# 206 methods for generic function \"+\":\n", "[1] +(x::T, y::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} in Base at int.jl:87\n", "[2] +(x::T, y::T) where T<:Union{Float16, Float32, Float64} in Base at float.jl:383\n", "[3] +(c::Union{UInt16, UInt32, UInt64, UInt8}, x::BigInt) in Base.GMP at gmp.jl:531\n", "[4] +(c::Union{Int16, Int32, Int64, Int8}, x::BigInt) in Base.GMP at gmp.jl:537\n", "[5] +(c::Union{UInt16, UInt32, UInt64, UInt8}, x::BigFloat) in Base.MPFR at mpfr.jl:398\n", "[6] +(c::Union{Int16, Int32, Int64, Int8}, x::BigFloat) in Base.MPFR at mpfr.jl:406\n", "[7] +(c::Union{Float16, Float32, Float64}, x::BigFloat) in Base.MPFR at mpfr.jl:414\n", "[8] +(x::Union{Dates.CompoundPeriod, Dates.Period}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:378\n", "[9] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.Hermitian) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:469\n", "[10] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.SymTridiagonal{var\"#s882\", V} where {var\"#s882\"<:Real, V<:AbstractVector{var\"#s882\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:488\n", "[11] +(H::LinearAlgebra.Hermitian, D::LinearAlgebra.Diagonal{var\"#s885\", V} where {var\"#s885\"<:Real, V<:AbstractVector{var\"#s885\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/diagonal.jl:197\n", "[12] +(A::LinearAlgebra.Hermitian, J::LinearAlgebra.UniformScaling{<:Complex}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:195\n", "[13] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:15\n", "[14] +(A::LinearAlgebra.Hermitian, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:18\n", "[15] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Symmetric{<:Real, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:26\n", "[16] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.Symmetric{var\"#s885\", S} where {var\"#s885\"<:Real, S<:(AbstractMatrix{<:var\"#s885\"})}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:483\n", "[17] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:24\n", "[18] +(x::P, y::P) where P<:Dates.Period in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:77\n", "[19] +(x::Dates.Period, y::Dates.Period) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:367\n", "[20] +(y::Dates.Period, x::Dates.CompoundPeriod) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:369\n", "[21] +(y::Dates.Period, x::Dates.TimeType) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:85\n", "[22] +(x::Dates.Period, r::AbstractRange{<:Dates.TimeType}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/ranges.jl:63\n", "[23] +(y::Union{Dates.CompoundPeriod, Dates.Period}, x::AbstractArray{<:Dates.TimeType}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:14\n", "[24] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:14\n", "[25] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Hermitian) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:17\n", "[26] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:14\n", "[27] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Symmetric) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:17\n", "[28] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:638\n", "[29] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:640\n", "[30] +(x::LinearAlgebra.UpperTriangular, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[31] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:98\n", "[32] +(A::BitArray, B::BitArray) in Base at bitarray.jl:1184\n", "[33] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:642\n", "[34] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:644\n", "[35] +(UL::LinearAlgebra.UnitUpperTriangular, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:181\n", "[36] +(x::LinearAlgebra.UnitUpperTriangular, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[37] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:98\n", "[38] +(z::Complex, w::Complex) in Base at complex.jl:288\n", "[39] +(Da::LinearAlgebra.Diagonal, Db::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/diagonal.jl:184\n", "[40] +(D::LinearAlgebra.Diagonal, S::LinearAlgebra.Symmetric) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/diagonal.jl:188\n", "[41] +(D::LinearAlgebra.Diagonal{var\"#s885\", V} where {var\"#s885\"<:Real, V<:AbstractVector{var\"#s885\"}}, H::LinearAlgebra.Hermitian) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/diagonal.jl:194\n", "[42] +(x::LinearAlgebra.Diagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[43] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:137\n", "[44] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:147\n", "[45] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:175\n", "[46] +(A::LinearAlgebra.Diagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:253\n", "[47] +(r1::LinRange{T}, r2::LinRange{T}) where T in Base at range.jl:1431\n", "[48] +(x::Rational, y::Integer) in Base at rational.jl:313\n", "[49] +(x::AbstractIrrational, y::AbstractIrrational) in Base at irrationals.jl:158\n", "[50] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:643\n", "[51] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:645\n", "[52] +(UL::LinearAlgebra.UnitLowerTriangular, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:181\n", "[53] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:98\n", "[54] +(x::T, y::Integer) where T<:AbstractChar in Base at char.jl:237\n", "[55] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/tridiag.jl:207\n", "[56] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Symmetric) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:485\n", "[57] +(A::LinearAlgebra.SymTridiagonal{var\"#s883\", V} where {var\"#s883\"<:Real, V<:AbstractVector{var\"#s883\"}}, B::LinearAlgebra.Hermitian) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:487\n", "[58] +(x::LinearAlgebra.SymTridiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[59] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:157\n", "[60] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:171\n", "[61] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:225\n", "[62] +(A::LinearAlgebra.SymTridiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:243\n", "[63] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:639\n", "[64] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:641\n", "[65] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:98\n", "[66] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/tridiag.jl:741\n", "[67] +(x::LinearAlgebra.Tridiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[68] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:169\n", "[69] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:185\n", "[70] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:205\n", "[71] +(A::LinearAlgebra.Tridiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:238\n", "[72] +(index1::CartesianIndex{N}, index2::CartesianIndex{N}) where N in Base.IteratorsMD at multidimensional.jl:114\n", "[73] +(r1::OrdinalRange, r2::OrdinalRange) in Base at range.jl:1424\n", "[74] +(y::AbstractFloat, x::Bool) in Base at bool.jl:172\n", "[75] +(y::Dates.TimeType, x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:18\n", "[76] +(x::Dates.Instant) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:4\n", "[77] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/bidiag.jl:365\n", "[78] +(x::LinearAlgebra.Bidiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[79] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:106\n", "[80] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:106\n", "[81] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:106\n", "[82] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:106\n", "[83] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:127\n", "[84] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:195\n", "[85] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:215\n", "[86] +(A::LinearAlgebra.Bidiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:248\n", "[87] +(x::Ptr, y::Integer) in Base at pointer.jl:159\n", "[88] +(A::SparseArrays.AbstractSparseMatrixCSC, B::SparseArrays.AbstractSparseMatrixCSC) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:1829\n", "[89] +(x::SparseArrays.AbstractSparseVector, y::SparseArrays.AbstractSparseVector) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/sparsevector.jl:1384\n", "[90] +(A::SparseArrays.AbstractSparseMatrixCSC, B::Array) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:1832\n", "[91] +(A::SparseArrays.AbstractSparseMatrixCSC, J::LinearAlgebra.UniformScaling) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:3821\n", "[92] +(r::AbstractRange{<:Dates.TimeType}, x::Dates.Period) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/ranges.jl:64\n", "[93] +(x::AbstractArray{<:Dates.TimeType}, y::Union{Dates.CompoundPeriod, Dates.Period}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:6\n", "[94] +(x::Base.TwicePrecision, y::Number) in Base at twiceprecision.jl:290\n", "[95] +(x::Base.TwicePrecision{T}, y::Base.TwicePrecision{T}) where T in Base at twiceprecision.jl:296\n", "[96] +(x::Base.TwicePrecision, y::Base.TwicePrecision) in Base at twiceprecision.jl:301\n", "[97] +(J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:149\n", "[98] +(J::LinearAlgebra.UniformScaling, x::Number) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:144\n", "[99] +(J1::LinearAlgebra.UniformScaling, J2::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:150\n", "[100] +(J::LinearAlgebra.UniformScaling, B::BitMatrix) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:152\n", "[101] +(x::LinearAlgebra.UniformScaling, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:109\n", "[102] +(J::LinearAlgebra.UniformScaling, F::LinearAlgebra.Hessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:642\n", "[103] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Tridiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:257\n", "[104] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.SymTridiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:262\n", "[105] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Bidiagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:267\n", "[106] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Diagonal{var\"#s885\", V} where {var\"#s885\"<:Number, V<:AbstractVector{var\"#s885\"}}) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:272\n", "[107] +(J::LinearAlgebra.UniformScaling, A::AbstractMatrix) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:153\n", "[108] +(x::Dates.AbstractTime, y::Missing) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:88\n", "[109] +(A::LinearAlgebra.AbstractTriangular, B::LinearAlgebra.AbstractTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/triangular.jl:646\n", "[110] +(F::LinearAlgebra.Hessenberg, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:641\n", "[111] +(r1::StepRangeLen{T, R}, r2::StepRangeLen{T, R}) where {R<:Base.TwicePrecision, T} in Base at twiceprecision.jl:644\n", "[112] +(r1::StepRangeLen{T, S}, r2::StepRangeLen{T, S}) where {T, S} in Base at range.jl:1447\n", "[113] +(r1::Union{LinRange, OrdinalRange, StepRangeLen}, r2::Union{LinRange, OrdinalRange, StepRangeLen}) in Base at range.jl:1440\n", "[114] +(A::LinearAlgebra.Symmetric, B::LinearAlgebra.Symmetric) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:469\n", "[115] +(A::LinearAlgebra.Symmetric, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:486\n", "[116] +(S::LinearAlgebra.Symmetric, D::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/diagonal.jl:191\n", "[117] +(A::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:15\n", "[118] +(A::LinearAlgebra.Symmetric, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:18\n", "[119] +(A::LinearAlgebra.Symmetric{<:Real, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:25\n", "[120] +(A::LinearAlgebra.Symmetric{var\"#s884\", S} where {var\"#s884\"<:Real, S<:(AbstractMatrix{<:var\"#s884\"})}, B::LinearAlgebra.Hermitian) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/symmetric.jl:484\n", "[121] +(A::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/linalg.jl:23\n", "[122] +(A::Array, Bs::Array...) in Base at arraymath.jl:12\n", "[123] +(X::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}, Y::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:62\n", "[124] +(A::Array, B::SparseArrays.AbstractSparseMatrixCSC) in SparseArrays at /usr/share/julia/stdlib/v1.8/SparseArrays/src/sparsematrix.jl:1833\n", "[125] +(x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:55\n", "[126] +(x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}, y::Dates.TimeType) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/deprecated.jl:10\n", "[127] +(A::LinearAlgebra.UpperHessenberg, B::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:101\n", "[128] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[129] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Diagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[130] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Bidiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[131] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Tridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[132] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[133] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[134] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/hessenberg.jl:108\n", "[135] +(A::AbstractArray, B::AbstractArray) in Base at arraymath.jl:6\n", "[136] +(dt::Dates.DateTime, y::Dates.Year) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:23\n", "[137] +(dt::Dates.DateTime, z::Dates.Month) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:47\n", "[138] +(x::Dates.DateTime, y::Dates.Quarter) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:75\n", "[139] +(x::Dates.DateTime, y::Dates.Period) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:81\n", "[140] +(x::BigInt, c::Union{UInt16, UInt32, UInt64, UInt8}) in Base.GMP at gmp.jl:530\n", "[141] +(x::BigInt, c::Union{Int16, Int32, Int64, Int8}) in Base.GMP at gmp.jl:536\n", "[142] +(x::BigInt, y::BigInt) in Base.GMP at gmp.jl:482\n", "[143] +(a::BigInt, b::BigInt, c::BigInt) in Base.GMP at gmp.jl:522\n", "[144] +(a::BigInt, b::BigInt, c::BigInt, d::BigInt) in Base.GMP at gmp.jl:523\n", "[145] +(a::BigInt, b::BigInt, c::BigInt, d::BigInt, e::BigInt) in Base.GMP at gmp.jl:524\n", "[146] +(x::BigInt, y::BigInt, rest::BigInt...) in Base.GMP at gmp.jl:657\n", "[147] +(c::BigInt, x::BigFloat) in Base.MPFR at mpfr.jl:422\n", "[148] +(x::Dates.Time, y::Dates.TimePeriod) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:83\n", "[149] +(t::Dates.Time, dt::Dates.Date) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:20\n", "[150] +(::Missing) in Base at missing.jl:101\n", "[151] +(::Missing, ::Number) in Base at missing.jl:123\n", "[152] +(x::Missing, y::Dates.AbstractTime) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:89\n", "[153] +(::Missing, ::Missing) in Base at missing.jl:122\n", "[154] +(x::Bool) in Base at bool.jl:159\n", "[155] +(x::Number, y::Base.TwicePrecision) in Base at twiceprecision.jl:294\n", "[156] +(::Number, ::Missing) in Base at missing.jl:124\n", "[157] +(x::Number, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:145\n", "[158] +(x::Integer, y::Ptr) in Base at pointer.jl:161\n", "[159] +(y::Integer, x::Rational) in Base at rational.jl:320\n", "[160] +(x::Integer, y::AbstractChar) in Base at char.jl:247\n", "[161] +(x::Bool, y::T) where T<:AbstractFloat in Base at bool.jl:169\n", "[162] +(x::Bool, y::Bool) in Base at bool.jl:162\n", "[163] +(a::Integer, b::Integer) in Base at int.jl:987\n", "[164] +(x::Bool, z::Complex{Bool}) in Base at complex.jl:299\n", "[165] +(x::Real, z::Complex{Bool}) in Base at complex.jl:313\n", "[166] +(x::Bool, z::Complex) in Base at complex.jl:306\n", "[167] +(x::Real, z::Complex) in Base at complex.jl:325\n", "[168] +(z::Complex{Bool}, x::Bool) in Base at complex.jl:300\n", "[169] +(z::Complex, x::Bool) in Base at complex.jl:307\n", "[170] +(z::Complex{Bool}, x::Real) in Base at complex.jl:314\n", "[171] +(z::Complex) in Base at complex.jl:286\n", "[172] +(z::Complex, x::Real) in Base at complex.jl:326\n", "[173] +(x::Rational{BigInt}, y::Rational{BigInt}) in Base.GMP.MPQ at gmp.jl:922\n", "[174] +(x::Rational) in Base at rational.jl:270\n", "[175] +(x::Rational, y::Rational) in Base at rational.jl:284\n", "[176] +(level::Base.CoreLogging.LogLevel, inc::Integer) in Base.CoreLogging at logging.jl:131\n", "[177] +(B::BitMatrix, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:151\n", "[178] +(A::AbstractMatrix, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /usr/share/julia/stdlib/v1.8/LinearAlgebra/src/uniformscaling.jl:214\n", "[179] +(x::AbstractArray{<:Number}) in Base at abstractarraymath.jl:220\n", "[180] +(dt::Dates.Date, t::Dates.Time) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:19\n", "[181] +(dt::Dates.Date, y::Dates.Year) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:27\n", "[182] +(dt::Dates.Date, z::Dates.Month) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:54\n", "[183] +(x::Dates.Date, y::Dates.Quarter) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:73\n", "[184] +(x::Dates.Date, y::Dates.Week) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:77\n", "[185] +(x::Dates.Date, y::Dates.Day) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:79\n", "[186] +(x::Dates.TimeType) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/arithmetic.jl:8\n", "[187] +(a::Dates.TimeType, b::Dates.Period, c::Dates.Period) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:389\n", "[188] +(a::Dates.TimeType, b::Dates.Period, c::Dates.Period, d::Dates.Period...) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:390\n", "[189] +(x::Dates.TimeType, y::Dates.CompoundPeriod) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:392\n", "[190] +(x::BigFloat, c::Union{UInt16, UInt32, UInt64, UInt8}) in Base.MPFR at mpfr.jl:393\n", "[191] +(x::BigFloat, c::Union{Int16, Int32, Int64, Int8}) in Base.MPFR at mpfr.jl:401\n", "[192] +(x::BigFloat, c::Union{Float16, Float32, Float64}) in Base.MPFR at mpfr.jl:409\n", "[193] +(x::BigFloat, y::BigFloat) in Base.MPFR at mpfr.jl:386\n", "[194] +(x::BigFloat, c::BigInt) in Base.MPFR at mpfr.jl:417\n", "[195] +(a::BigFloat, b::BigFloat, c::BigFloat) in Base.MPFR at mpfr.jl:558\n", "[196] +(a::BigFloat, b::BigFloat, c::BigFloat, d::BigFloat) in Base.MPFR at mpfr.jl:564\n", "[197] +(a::BigFloat, b::BigFloat, c::BigFloat, d::BigFloat, e::BigFloat) in Base.MPFR at mpfr.jl:571\n", "[198] +(x::Number) in Base at operators.jl:528\n", "[199] +(x::T, y::T) where T<:Number in Base at promotion.jl:463\n", "[200] +(x::Number, y::Number) in Base at promotion.jl:388\n", "[201] +(x::Dates.CompoundPeriod, y::Dates.Period) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:368\n", "[202] +(x::Dates.CompoundPeriod, y::Dates.TimeType) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:398\n", "[203] +(x::Dates.CompoundPeriod, y::Dates.CompoundPeriod) in Dates at /usr/share/julia/stdlib/v1.8/Dates/src/periods.jl:370\n", "[204] +(a::Pkg.Resolve.FieldValue, b::Pkg.Resolve.FieldValue) in Pkg.Resolve at /usr/share/julia/stdlib/v1.8/Pkg/src/Resolve/fieldvalues.jl:43\n", "[205] +(a::Pkg.Resolve.VersionWeight, b::Pkg.Resolve.VersionWeight) in Pkg.Resolve at /usr/share/julia/stdlib/v1.8/Pkg/src/Resolve/versionweights.jl:22\n", "[206] +(a, b, c, xs...) in Base at operators.jl:591" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods(+)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Portanto, agora podemos aplicar `teste` a strings e inteiros.\n", "Quando aplicamos `teste` a um par de argumentos, a Julia vai inferir os tipos dos argumentos e despachar o método apropriado.\n", "Isso é **despacho múltiplo**.\n", "Despacho múltiplo torna os programas genéricos e rápidos.\n", "\n", "Para ver qual método está sendo despachado quando chamamos uma função genérica, usamos a macro `@which`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "teste(x::Int64, y::Int64) in Main at In[7]:1" ], "text/plain": [ "teste(x::Int64, y::Int64) in Main at In[7]:1" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@which teste(2, 3)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "+(x::T, y::T) where T<:Union{Float16, Float32, Float64} in Base at float.jl:383" ], "text/plain": [ "+(x::T, y::T) where T<:Union{Float16, Float32, Float64} in Base at float.jl:383" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "@which 3.0 + 5.0" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.8.2", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.2" } }, "nbformat": 4, "nbformat_minor": 4 }