Automatic type constructor for a type synonym

haskell

Solution

I have a type called `Vec2F` and I can use it like this `Vec2F 0.0 0.0`

No you cannot.

What you actually have is a data definition

data Vec2F = Vec2F Double Double

It's the second `Vec2f` you can use in expressions. These two occurrences of `Vec2F` are invisible to each other. They live in separate namespaces. One is a type constructor and the other is a data constructor.

You can have definitions like

data Foo = Bar Double
data Bar = Foo Float

and the language will swallow it (as opposed to the human reader).

When you define a type synonym, it only becomes a synonym for the type (constructor). It knows nothing about the data constructor.

There's no way to define a data constructor synonym in standard Haskell. You probably can use view patterns `[-XViewPatterns]` to a similar effect. I have not tried them.

Problem

I have a type called `Vec2F` and I can use it like this `Vec2F 0.0 0.0`. But I want to make my own type `type Direction = Vec2F` But then I can't do `Direction 0.0 0.0` and I have to define a new function which is a little bit cumbersome. `direction :: Float -> Float -> Vec2F direction = Vec2F` What alternatives do I have?

Original source