# Square root array using composition function

**URL:** <https://discourse.julialang.org/t/square-root-array-using-composition-function/17014>\
**Category:** General Usage\
**Tags:** broadcast, composition\
**Created:** [October 31, 2018, 5:07pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014 "2018-10-31T17:07:15Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![dribeiro142](https://avatars.discourse-cdn.com/v4/letter/d/b782af/32.png) [@dribeiro142](https://discourse.julialang.org/u/dribeiro142)\
**Post date:** [October 31, 2018, 5:07pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/1 "2018-10-31T17:07:15Z")

</div>

I want to make this function:

sum(sqrt.(rand(20)))

using function composition, I tried this forms, but none works.

(sum ∘ sqrt.)(rand(10))  
(sum ∘ sqrt)(rand(10))  
(sum .∘ sqrt)(rand(10))  
(sum ∘ sqrt)(.rand(10))

How do I do this function composition works?

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [October 31, 2018, 7:37pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/2 "2018-10-31T19:37:02Z")

</div>

Close, it’s the one permutation you didn’t try:

```julia
julia> (sum ∘ sqrt).(rand(10))
10-element Array{Float64,1}:
 0.8980420507456252
 0.2847174420155775
 0.6851298609821408
 0.6751897599452852
 0.976812014821054
 0.10750987261017839
 0.47214123436582084
 0.9207085026619227
 0.544544821255565
 0.31831962863085816

```

You’re just composing functions not doing element-wise composition of vectors of functions, so you just use `∘`. The `.` is part of the call syntax, not the name of the function. You can think of `.( )` as the “vectorized call operator” just like `( )` after an expression is the normal call operator.

---

<div class="post-metadata">

**Author:** ![adamslc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adamslc/32/3452_2.png) [@adamslc](https://discourse.julialang.org/u/adamslc)\
**Post date:** [October 31, 2018, 7:53pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/3 "2018-10-31T19:53:48Z")

</div>

That isn’t equivalent to `sum(sqrt.(rand(20)))` because it is broadcasting `sum` as well. I don’t think that there is a way to achieve this using function composition.

---

<div class="post-metadata">

**Author:** ![tkoolen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkoolen/32/1603_2.png) [@tkoolen](https://discourse.julialang.org/u/tkoolen)\
**Post date:** [October 31, 2018, 7:59pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/4 "2018-10-31T19:59:04Z")

</div>

```julia
sum ∘ (x -> sqrt.(x))

```

?

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [October 31, 2018, 8:48pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/5 "2018-10-31T20:48:56Z")

</div>

I mean there’s this:

```julia
julia> (sum ∘ (v -> sqrt.(v)))(rand(20))
13.539906421661865

```

But I’m not sure why you’d want to write that instead of `sum(sqrt.(rand(20)))`.

---

<div class="post-metadata">

**Author:** ![simonbyrne](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simonbyrne/32/19_2.png) [@simonbyrne](https://discourse.julialang.org/u/simonbyrne)\
**Post date:** [October 31, 2018, 8:54pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/6 "2018-10-31T20:54:25Z")

</div>

if the `rand` is to be part of it, then the simplest is

```julia
sum(x -> sqrt(rand()), 1:20)

```

if the `rand(20)` is a placeholder for another array `X`, then

```julia
sum(sqrt, X)

```

---

<div class="post-metadata">

**Author:** ![Liso](https://avatars.discourse-cdn.com/v4/letter/l/898d66/32.png) [@Liso](https://discourse.julialang.org/u/Liso)\
**Post date:** [October 31, 2018, 9:52pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/8 "2018-10-31T21:52:00Z")

</div>

> [@tkoolen](#):
>
> sum ∘ (x -\> sqrt.(x))

OP probably expected that something like `sqrt.` or `(sqrt.)` could be syntactic sugar to `x -> sqrt.(x)`

Is there any reason why it is not?

---

<div class="post-metadata">

**Author:** ![adamslc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adamslc/32/3452_2.png) [@adamslc](https://discourse.julialang.org/u/adamslc)\
**Post date:** [October 31, 2018, 10:08pm UTC](https://discourse.julialang.org/t/square-root-array-using-composition-function/17014/9 "2018-10-31T22:08:36Z")

</div>

I believe that this transformation would break broadcast fusion. For example:

```julia
a(x) = 2x
b(x) = x/2
x = rand(10000);

@btime a.(b.(x)); # 9.7 μs
@btime a.((x -> b.(x))(x)); # 23.6 μs

```

(using timing results as a proxy for broadcast fusion…)
