Proposed alias for union types

Introduction

I dug into the topic further to try to find its origins. I was not quite satisfied with the Python discussion that mostly pointed at Scala, but I thought that would make a good starting point. I ended up seeing the origins of this from the Curry-Howard Isomorphism suggesting that logical or is indeed the historical operator.

Scala 3

I was trying to read into the early origins of the use of | in Scala 3. One important note is that in Scala 3 they also have intersection types, which uses & as an operator.

TypeScript

Note that TypeScript similarly used | and & for Union and Intersection types.

Scala.js

Some of the precedent seems to go an earlier implementation in scala.js:

There the original operator proposed was \/.

Curry-Howard Isomorphism (correspondence)

Reading further back, I found this blog post by Miles Sabin in 2011:

https://milessabin.com/blog/2011/06/09/scala-union-types-curry-howard/

This in turn refers to the Curry-Howard isomorpism relating type theory and structural logic.

https://en.m.wikibooks.org/wiki/Haskell/The_Curry–Howard_isomorphism

There the operators are and , \vee and \wedge respectively. is the logical disjunction operator.

Note that logical disjunction in terms of boolean algebra is what we usually use | for now.

See W. A. Howard. The Formulae-as-Types Notion of Construction. 1969, 1980.

If we keep reading, I think we will see some origin of using | in ML, particularly Standard ML.

Summary

The use of | for type unions originates from the following.

  • The Curry-Howard Isomorphism relates type theory with structural logic. Through the isomorpism a type union corresponds with logical or.
  • In programming languages, we usually have written as |.

Several here have proposed using , the set theory union. Note the visual similarity to . Apparently this is not a coincidence. However, Curry-Howard refers to logic not sets.

Above there are arguments that | is the bitwise or as currently documented. I think that definition only makes sense for bitstype instances. Rather the correct definition should be | refers to “logical or” or “logical disjunction”.

I see the points about sum types, tagged unions, but I do not currently see that becoming a fundamental part of the language in Julia 1 beyond its implementation in a package such as SumTypes.jl.

In light of this background, I am more in favor of using | for this purpose than before I started digging into the topic.

15 Likes