Lably
Skip to content

Flow-sensitive typing

  • 7 min read
  • 4 chapters

Related on Lably

Through Expression (computer science), Control flow and Type conversion

In statically typed languages, a type of an expression is determined by the types of the sub-expressions that compose it. However, in flow-sensitive typing, an expression's type may be updated to a more specific type if it follows an operation that validates its type. Validating operations can include type predicates, imperative updates, and control flow.

Examples

Ceylon

This example in Ceylon illustrates the concept:

<span id="mwFQ"></span><span class="c1" id="mwFg">// Object? means the variable "name" is of type Object or else null</span> <span class="kt" id="mwFw">void</span><span class="w" id="mwGA"> </span><span class="nf" id="mwGQ">hello</span><span class="o" id="mwGg">(</span><span class="n" id="mwGw">Object</span><span class="o" id="mwHA">?</span><span class="w" id="mwHQ"> </span><span class="n" id="mwHg">name</span><span class="o" id="mwHw">)</span><span class="w" id="mwIA"> </span><span class="o" id="mwIQ">{</span> <span class="w" id="mwIg"> </span><span class="k" id="mwIw">if</span><span class="w" id="mwJA"> </span><span class="o" id="mwJQ">(</span><span class="k" id="mwJg">is</span><span class="w" id="mwJw"> </span><span class="n" id="mwKA">String</span><span class="w" id="mwKQ"> </span><span class="n" id="mwKg">name</span><span class="o" id="mwKw">)</span><span class="w" id="mwLA"> </span><span class="o" id="mwLQ">{</span> <span class="w" id="mwLg"> </span><span class="c1" id="mwLw">// "name" now has type String in this block</span> <span class="w" id="mwMA"> </span><span class="n" id="mwMQ">print</span><span class="o" id="mwMg">(</span><span class="s" id="mwMw">"Hello, ``name``!"</span><span class="o" id="mwNA">);</span> <span class="w" id="mwNQ"> </span><span class="c1" id="mwNg">// and it is possible to call String methods on the variable</span> <span class="w" id="mwNw"> </span><span class="n" id="mwOA">print</span><span class="o" id="mwOQ">(</span><span class="s" id="mwOg">" String.size is ``name.size``"</span><span class="o" id="mwOw">);</span> <span class="w" id="mwPA"> </span><span class="o" id="mwPQ">}</span> <span class="w" id="mwPg"> </span><span class="k" id="mwPw">else</span><span class="w" id="mwQA"> </span><span class="nf" id="mwQQ">if</span><span class="w" id="mwQg"> </span><span class="o" id="mwQw">(</span><span class="k" id="mwRA">exists</span><span class="w" id="mwRQ"> </span><span class="n" id="mwRg">name</span><span class="o" id="mwRw">)</span><span class="w" id="mwSA"> </span><span class="o" id="mwSQ">{</span> <span class="w" id="mwSg"> </span><span class="c1" id="mwSw">// "name" now has type Object in this block</span> <span class="w" id="mwTA"> </span><span class="n" id="mwTQ">print</span><span class="o" id="mwTg">(</span><span class="s" id="mwTw">"Hello, object ``name``!"</span><span class="o" id="mwUA">);</span> <span class="w" id="mwUQ"> </span><span class="o" id="mwUg">}</span> <span class="w" id="mwUw"> </span><span class="k" id="mwVA">else</span><span class="w" id="mwVQ"> </span><span class="o" id="mwVg">{</span> <span class="w" id="mwVw"> </span><span class="n" id="mwWA">print</span><span class="o" id="mwWQ">(</span><span class="s" id="mwWg">"Hello, world!"</span><span class="o" id="mwWw">);</span> <span class="w" id="mwXA"> </span><span class="o" id="mwXQ">}</span> <span class="o" id="mwXg">}</span> <span class="n" id="mwXw">hello</span><span class="o" id="mwYA">(</span><span class="kc" id="mwYQ">null</span><span class="o" id="mwYg">);</span> <span class="n" id="mwYw">hello</span><span class="o" id="mwZA">(</span><span class="mi" id="mwZQ">1</span><span class="o" id="mwZg">);</span> <span class="n" id="mwZw">hello</span><span class="o" id="mwaA">(</span><span class="s" id="mwaQ">"John Doe"</span><span class="o" id="mwag">);</span>

and which outputs:

<span id="mwbg"></span><span class="go" id="mwbw">Hello, world!</span> <span class="go" id="mwcA">Hello, object 1!</span> <span class="go" id="mwcQ">Hello, John Doe!</span> <span class="go" id="mwcg"> String.size is 8</span>

Kotlin

This example is in Kotlin:

<span id="mweA"></span><span class="kd" id="mweQ">fun</span><span class="w" id="mweg"> </span><span class="nf" id="mwew">hello</span><span class="p" id="mwfA">(</span><span class="n" id="mwfQ">obj</span><span class="p" id="mwfg">:</span><span class="w" id="mwfw"> </span><span class="kt" id="mwgA">Any</span><span class="p" id="mwgQ">)</span><span class="w" id="mwgg"> </span><span class="p" id="mwgw">{</span> <span class="w" id="mwhA"> </span><span class="c1" id="mwhQ">// A type cast fails if `obj` is not a String</span> <span class="w" id="mwhg"> </span><span class="n" id="mwhw">obj</span><span class="w" id="mwiA"> </span><span class="k" id="mwiQ">as</span><span class="w" id="mwig"> </span><span class="kt" id="mwiw">String</span> <span class="w" id="mwjA"> </span><span class="c1" id="mwjQ">// Since the type cast did not fail, `obj` must be a String!</span> <span class="w" id="mwjg"> </span><span class="kd" id="mwjw">val</span><span class="w" id="mwkA"> </span><span class="nv" id="mwkQ">l</span><span class="w" id="mwkg"> </span><span class="o" id="mwkw">=</span><span class="w" id="mwlA"> </span><span class="n" id="mwlQ">obj</span><span class="p" id="mwlg">.</span><span class="na" id="mwlw">length</span> <span class="w" id="mwmA"> </span><span class="n" id="mwmQ">println</span><span class="p" id="mwmg">(</span><span class="s" id="mwmw">"'</span><span class="si" id="mwnA">$</span><span class="n" id="mwnQ">obj</span><span class="s" id="mwng">' is a string of length </span><span class="si" id="mwnw">$</span><span class="n" id="mwoA">l</span><span class="s" id="mwoQ">"</span><span class="p" id="mwog">)</span> <span class="p" id="mwow">}</span> <span class="w" id="mwpA"> </span> <span class="n" id="mwpQ">hello</span><span class="p" id="mwpg">(</span><span class="s" id="mwpw">"Mooooo"</span><span class="p" id="mwqA">)</span>

Sign in to keep reading

3 more chapters are free with a Lably account.

More in Computing and communication