# Broadcasting like a Number

**URL:** <https://discourse.julialang.org/t/broadcasting-like-a-number/1425>\
**Category:** General Usage\
**Tags:** question, broadcast\
**Created:** [January 12, 2017, 3:05am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425 "2017-01-12T03:05:00Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)\
**Post date:** [January 12, 2017, 3:05am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/1 "2017-01-12T03:05:00Z")

</div>

I’m trying to create a Type that broadcasts like a `Number` without being `<: Number`, see example code below. I tried the following, but broadcasting is returning a zero-dimensional array where `Number`s return a `Number`.

It looks like `broadcast` is overriden for `Number`, is overriding the only way to replicate the behaviour of `Number`? This is unfortunate as I would like to mix-and-match `Number` and `Foo` (and of course `Vector{<:Number}` and `Vector{Foo}`).

```julia
julia> immutable Foo end;

julia> Base.size(::Foo) = ();

julia> Base.getindex(f::Foo,::CartesianIndex{0}) = f;

julia> f(::Number,::Foo) = "foo";

julia> f(::Number,::Number) = "number";

julia> f.(1,Foo())
0-dimensional Array{String,0}:
"foo"

julia> f.(1,2)
"number"

```

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [January 12, 2017, 3:21am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/2 "2017-01-12T03:21:40Z")

</div>

Is this for `Fun` types?

---

<div class="post-metadata">

**Author:** ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)\
**Post date:** [January 12, 2017, 3:24am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/3 "2017-01-12T03:24:18Z")

</div>

Yes it is for `Fun`, and also `Domain`.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [January 12, 2017, 3:26am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/4 "2017-01-12T03:26:46Z")

</div>

Is there an issue for tracking this? Curious for trying it in OrdinaryDiffEq.jl afterwards.

---

<div class="post-metadata">

**Author:** ![rdeits](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rdeits/32/286_2.png) [@rdeits](https://discourse.julialang.org/u/rdeits)\
**Post date:** [January 12, 2017, 3:27am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/5 "2017-01-12T03:27:51Z")

</div>

I just checked, and this does work correctly on julia-0.6, even without defining `size()` and `getindex()` for your type:

```julia
julia> immutable Foo end;

julia> f(::Number,::Foo) = "foo";

julia> f(::Number,::Number) = "number";

julia> f.(1,Foo())
"foo"

julia> f.(1,2)
"number"

```

I realize that that doesn’t solve your immediate problem, but at least this will be easier in the future.

---

<div class="post-metadata">

**Author:** ![dlfivefifty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dlfivefifty/32/1959_2.png) [@dlfivefifty](https://discourse.julialang.org/u/dlfivefifty)\
**Post date:** [January 12, 2017, 3:31am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/6 "2017-01-12T03:31:43Z")

</div>

Great! I’ll work around it in the meantime (where it came up it can be fixed by having multiple overrides without dealing with `broadcast` directly.)

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [January 12, 2017, 4:08am UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/7 "2017-01-12T04:08:19Z")

</div>

> [@rdeits](#):
>
> I just checked, and this does work correctly on julia-0.6

Yes, in Julia 0.5 the `broadcast` function only knows about numbers as scalars. The functionality is greatly expanded in 0.6.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [February 10, 2017, 2:13pm UTC](https://discourse.julialang.org/t/broadcasting-like-a-number/1425/8 "2017-02-10T14:13:36Z")

</div>

In preparation to `0.6`, in `0.5` I am using something like

```julia
"Making types work with `broadcast` and dot-syntax in 0.5."
macro ensure_broadcast(typ::Symbol)
    VERSION ≥ v"0.6.0-" && return nothing
    quote
        Base.size(::$typ) = ()
        Base.getindex(f::$typ,::CartesianIndex{0}) = f;
    end
end

```

but I am wondering if there is going to be something like this in `Compat`, or is that only backward-looking?
