# Why Val{...}?

**URL:** https://discourse.julialang.org/t/why-val/16035
**Category:** General Usage
**Tags:** question
**Created:** [October 8, 2018, 6:19pm UTC](https://discourse.julialang.org/t/why-val/16035 "2018-10-08T18:19:37Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)
#### Post date: [October 8, 2018, 6:19pm UTC](https://discourse.julialang.org/t/why-val/16035/1 "2018-10-08T18:19:37Z")

</div>

Why is `Val{..}` needed? Shouldn’t constant propagation make `Val` obsolete ([https://github.com/JuliaLang/julia/pull/24362](https://github.com/JuliaLang/julia/pull/24362))?

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [October 8, 2018, 6:43pm UTC](https://discourse.julialang.org/t/why-val/16035/3 "2018-10-08T18:43:31Z")

</div>

`Val` forces specialization which can sometimes be desired.

---

<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 8, 2018, 6:55pm UTC](https://discourse.julialang.org/t/why-val/16035/4 "2018-10-08T18:55:57Z")

</div>

`Val` also predates that kind of contant propagation.

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [October 8, 2018, 7:11pm UTC](https://discourse.julialang.org/t/why-val/16035/5 "2018-10-08T19:11:50Z")

</div>

> [@StefanKarpinski](#):
>
> `Val` also predates that kind of contant propagation.

Sure, my point was just that even now, there are reasons why it is still useful.

---

<div class="post-metadata">

### Author: ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)
#### Post date: [October 8, 2018, 7:13pm UTC](https://discourse.julialang.org/t/why-val/16035/6 "2018-10-08T19:13:15Z")

</div>

Is there an example, where constant propagation is not enough?

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [October 8, 2018, 7:15pm UTC](https://discourse.julialang.org/t/why-val/16035/7 "2018-10-08T19:15:10Z")

</div>

> [@e3c6](#):
>
> Is there an example, where constant propagation is not enough?

You might not only want to specialize on constants.

> [@Getproperty, decorations, inheritance in 0.7](https://discourse.julialang.org/t/getproperty-decorations-inheritance-in-0-7/11237/14):
>
> How about if I want to dynamically specialise on a certain value? using StaticArrays function f(n::Int) b = rand(SVector{n}) for i in 1:10000 b += rand(SVector{n}) end return b end function f(\_n::Val{n}) where n b = rand(SVector{n}) for i in 1:10000 b += rand(SVector{n}) end return b end g1() = f(rand(4:4)) g2() = f(Val(rand(4:4))) @time g1() @time g2() julia\> @time g1(); 0.015060 seconds (140.02 k allocations: 8.851 MiB) julia\> @time g2(…
