Technically it is not different but it allows one to write things in a much more compact way. And I would like the :|  types to be of arbitrary size, meaning each `in x y` invocation would inject a value at the right position in the sum type without having to declare all the possible sizes of coproducts. But maybe I could simply do that for some arbitrarily large number of types....

--
Arnaud Bailly
FoldLabs Associate: http://foldlabs.com

On Mon, Sep 15, 2014 at 3:38 PM, Richard Eisenberg <eir@cis.upenn.edu> wrote:
On Sep 15, 2014, at 9:14 AM, Arnaud Bailly <arnaud.oqube@gmail.com> wrote:

> Hello,
> I have a somewhat similar problem, trying to achieve union types but for the purpose of defining the set of allowable outcomes of a function. I have tried naively to define a type operator a :| b and I would like to be able to define a function like :
>
> f :: Int -> Int :| String :| Bool
> f 1 = in 1 1
> f 2 = in 2 "foo"
> f 3 = in 3 True

How is this different from `Either Int (Either String Bool)`?

Richard