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?

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

```
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.

1 Like

adamslc
October 31, 2018, 7:53pm
#3
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.

3 Likes

I mean there’s this:

```
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)))`

.

1 Like

if the `rand`

is to be part of it, then the simplest is

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

if the `rand(20)`

is a placeholder for another array `X`

, then

```
sum(sqrt, X)
```

1 Like

Liso
October 31, 2018, 9:52pm
#8

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?

adamslc
October 31, 2018, 10:08pm
#9
I believe that this transformation would break broadcast fusion. For example:

```
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…)