# Whiley Puzzler

I was having an interesting discussion with a colleague today about various aspects of Whiley, and we came up with an interesting bit of example code which is something of a puzzler. Consider these two different versions of a function `f(any)`

:

Version 1:

```
int f(any x):
if x is string:
return g(x)
else:
return g(x)
```

Version 2:

```
int f(any x):
return g(x)
```

The question is: *are the above two examples equivalent or not?* (answer below)

Well, the answer is: *no, they’re not equivalent*. You probably guessed that, but the question is: *why not?* Well, consider these two definitions for the function `g()`

used in the examples:

```
int g(any x):
return 1
int g(string x):
return 2
```

In the first example, after the type test `x is string`

Whiley’s flow-type system automatically retypes variable `x`

to have type `string`

. Therefore, the call `g(x)`

on the true branch is statically dispatched to `g(string)`

, whilst on the false branch it dispatches to `g(any)`

.

Anyhow, this puzzler is an interesting (and perhaps surprising) artifact of the choice to employ flow typing in Whiley. I wonder what other artifacts we’ll find…