# Why isn't this true: \`\[mean, mean, mean\] isa Vector{Function}\`? but this is: \`\[mean, mean, sum\] isa Vector{Function}\`?

**URL:** <https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238>\
**Category:** General Usage\
**Created:** [February 21, 2018, 8:47pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238 "2018-02-21T20:47:37Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![xiaodai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xiaodai/32/15937_2.png) [@xiaodai](https://discourse.julialang.org/u/xiaodai)\
**Post date:** [February 21, 2018, 8:47pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/1 "2018-02-21T20:47:38Z")

</div>

Why isn’t this true: `[mean, mean, mean] isa Vector{Function}`? but this is: `[mean, mean, sum] isa Vector{Function}`?

Basically I am writing a function like this, but it’s not dispatching on `applyfns2tuples([mean, mean,mean],[rand(5), rand(5), rand(5)])`.

```julia
function applyfns2tuples(fns::Vector{Functions}, tuples)
    ((fns1(tuples1) for (fns1,tuples1) in zip(fns, tuples)...)
end

```

---

<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:** [February 21, 2018, 9:00pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/2 "2018-02-21T21:00:41Z")

</div>

Type covariance. `Vector{Float64}` is not a `Vector{Number}`. `mean` is a function and every function is a type, so `Vector{#mean}` where `#mean <: Function`. Same thing as the number case.

---

<div class="post-metadata">

**Author:** ![ExpandingMan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/expandingman/32/866_2.png) [@ExpandingMan](https://discourse.julialang.org/u/ExpandingMan)\
**Post date:** [February 21, 2018, 9:02pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/3 "2018-02-21T21:02:31Z")

</div>

If you want, you can do `Function[mean, mean, mean]` to get `Vector{Function}`.

For another option, see [this package](https://github.com/yuyichao/FunctionWrappers.jl) which really, really, really should be in `Base`.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [February 21, 2018, 9:02pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/4 "2018-02-21T21:02:49Z")

</div>

This is the same phenomenon as

```julia
julia> Vector{Int} <: Vector{Number}
false

```

even though

```julia
julia> Int <: Number
true

```

I believe it has to do with type covariance.

On the other hand

```julia
julia> Vector{Int} <: Vector{T} where {T<:Number}
true

```

You can instead use

```julia
julia> [mean, mean, mean] isa Vector{T} where {T<:Function}
true

```

Or use shorthand notation

```julia
julia> [mean, mean, mean] isa Vector{<:Function}
true

```

---

<div class="post-metadata">

**Author:** ![xiaodai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xiaodai/32/15937_2.png) [@xiaodai](https://discourse.julialang.org/u/xiaodai)\
**Post date:** [February 21, 2018, 9:11pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/5 "2018-02-21T21:11:30Z")

</div>

> [@ChrisRackauckas](#):
>
> and every function is a type

It makes sense now. That’s why Julia can specialise on functions where functions are passed as arguments

---

<div class="post-metadata">

**Author:** ![piever](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/piever/32/1815_2.png) [@piever](https://discourse.julialang.org/u/piever)\
**Post date:** [February 21, 2018, 9:24pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/6 "2018-02-21T21:24:40Z")

</div>

If you need to dispatch you can use `Vector{<:Function}` which encompasses all the vectors of something that is a subtype of `Function`

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [February 21, 2018, 9:40pm UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/7 "2018-02-21T21:40:26Z")

</div>

This will work, and simplifies your notation a bit (drop the splatting):

```julia
apply(funs::Vector{<:Function}, args) = (f(arg) for (f, arg) in zip(funs, args))

```

I played around and tried to use tuples instead of `Vector{<:Function}`, but could not find a way to express it. For example,

```julia
julia> [mean, mean, sum] isa Vector{<:Function}
true

```

while

```julia
julia> (mean, mean, sum) isa NTuple{3, <:Function}
false

```

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [February 22, 2018, 12:40am UTC](https://discourse.julialang.org/t/why-isnt-this-true-mean-mean-mean-isa-vector-function-but-this-is-mean-mean-sum-isa-vector-function/9238/8 "2018-02-22T00:40:09Z")

</div>

```julia
julia> (mean, mean, sum) isa NTuple{3, Function}
true

julia> NTuple{3, <:Function}
Tuple{#s1,#s1,#s1} where #s1<:Function

```
