Consider these functions

```
f1 :: Maybe Int
f1 = return 1

f2 :: [Int]
f2 = return 1

```

Both have the same statement `return 1`. But the results are different. `f1` gives value `Just 1` and `f2` gives value `[1]`

Looks like Haskell invokes two different versions of `return` based on return type. I like to know more about this kind of function invocation. Is there a name for this feature in programming languages?