Let's say I have a type like this:
data Foo = Bar String | Baz | Qux String
I want to have a function like this:
get : Foo -> String
get (Bar s) = s
get (Qux s) = s
As written, this compiles, but it's not total, as there are missing cases; in other words, get Baz
is treated like a hole rather than as an expression that doesn't typecheck.
I want to replace that Foo
in the type signature of get
with something that specifies that the value must be either a Bar
or a Qux
. How can I express this subset of the Foo
type?