This post is a wiki! Any user can edit it to contribute!
Add items to this wiki post which you think are common pitfalls people stumble on when using PureScript for the first time or when using unfamiliar features of the language. Hopefully this is a good resource to use when making a “more professional or vetted” list of pitfalls.
Recursive type synonyms
You can’t define recursive type synonyms that never terminate; this will blow up in the compiler. If you need a type that refers to itself, then you should reach for a
data constructor instead.
forall in type synonyms
You usually do not want a
forall in a type synonym unless you are working with rank-N types. This is pretty uncommon in a usual application; if you aren’t specifically looking for that, then a
forall in a type synonym is probably not what you want.
A brief example, with codeLet's say you want to represent an address book as some container, `f` (which has a `Alternative` instance), containing a collection of `Contact`. A first cut at an `AddressBook` type might look like this:
type AddressBook = forall f. Alternative f => f Contact myFunc :: Contact -> AddressBook -> AddressBook
The idea is that you can insert a contact into a collection and produce a new collection. But this type will not give you what you want. Type synonyms can be inserted as-is where they are used:
-- this has a very different meaning myFunc :: Contact -> (forall f. Alternative f => f Contact) -> (forall f. Alternative f => f Contact) -- from this, which is what we wanted myFunc :: forall f. Alternative f => Contact -> f Contact -> f Contact
What we should have written was the below type, with the constraints placed on the function where the
forall is declared, not in the type synonym.
type AddressBook f = f Contact