purescript v0.10.1 Release Notes

Release Date: 2016-10-02 // over 5 years ago
  • ๐Ÿ’ฅ Breaking Changes

    ๐Ÿ›  The new functional dependencies feature fixes type inference in some cases involving multi-parameter type classes. However, due to a bug in the compiler, some of those expressions were previously type checking where they should not have. As a result, it is necessary to add functional dependencies to some classes in order to make previous code type-check in some cases. Known examples are:

    • MonadEff and MonadAff
    • ๐Ÿ’… MonadState, MonadReader, and the rest of the MTL-style classes in transformers

    ๐Ÿ†• New Features

    Data.Newtype Deriving


    It is now possible to derive the Newtype class for any data declaration which is a newtype, using the existing deriving instance syntax:

    newtype Test = Test String
    derive instance newtypeTest :: Newtype Test _

    Note that the second type argument should be specified as a wildcard, and will be inferred.

    โž• Added type level string functions


    ๐Ÿ— The Prim module now defines the TypeString and TypeConcat type constructors, which can be used to build more descriptive error messages which can depend on types, using the Fail constraint:

    instance cannotShowFunctions
        :: Fail ("Function type " <> TypeString (a -> b) <> " cannot be shown.")
        => Show (a -> b) where
      show _ = "unreachable"
    infixl 6 type TypeConcat as <>



    ๐Ÿ‘ The compiler now supports the --dump-corefn option, which causes the functional core to be dumped in output/**/corefn.json. This should be useful for implementing new backends which interpret the functional core.

    ๐Ÿ†• Newtype Deriving


    It is now possible to derive type class instances for newtypes, by reusing the instance for the underlying type:

    newtype X = X String
    derive newtype instance showX :: Show X

    Note that it is possible to derive instances for multi-parameter type classes, but the newtype must only appear as the last type argument.

    ๐Ÿ‘ Allow anonymous accessor chains (_.a.b)


    Anonymous record accessor syntax has been extended to work with chains of one or more accessors:

    getBaz = _.foo.bar.baz

    Functional Dependencies (@paf31)

    ๐Ÿ‘ The type class solver now supports functional dependencies. A multi-parameter type class can define dependencies between its type arguments by using the -> operator:

    class Stream el s | s -> el where
      cons :: el -> (Unit -> s) -> s
      uncons :: s -> { head :: el, tail :: s }

    Here, the s and el type arguments are related by a single functional dependency, which ensures that there is at most one instance for any given type s. Alternatively, the type s determines the type el, i.e. there is an implicit function from types s to types el. This information can be used by the solver to infer types where it was previously not possible.

    ๐Ÿ‘€ See the following examples for more information:

    โœจ Enhancements

    • Return qualifier from explicit/hiding imports (@nwolverson)
    • ๐Ÿ‘Œ Verify entry points exist in psc-bundle (@kRITZCREEK)
    • ๐Ÿ‘Œ Improved error messages for record subsumption (@FrigoEU)


    • Resolve types/kinds for operators (@kRITZCREEK)
    • Unify Completion Commands (@kRITZCREEK)
    • ๐Ÿ“œ Parse type annotations from source files (@kRITZCREEK)
    • โšก๏ธ Update pursuit JSON parsing (@nwolverson)
    • โœ‚ Remove a pursuit workaround (@kRITZCREEK)
    • โž• Add a suggestion to the UnusedDctorImport warning (@FrigoEU)
    • Return JSON errors for cycles in module dependencies (@kRITZCREEK)

    ๐Ÿ› Bug Fixes

    • ๐Ÿ›  Fix usage detection for operators (@garyb)
    • ๐Ÿ›  Fix handling of duplicate module imports in JS codegen (@garyb)
    • ๐Ÿ›  Fix a small bug in the type pretty-printer (@paf31)
    • ๐Ÿ›  Fix function application judgment (@paf31)
    • ๐Ÿ›  Fix inlining for $ and # operators (@garyb)
    • ๐Ÿ›  Fix everywhereOnTypesTopDown (@ianbollinger)
    • ๐Ÿ›  Fix unification of string literals (@paf31)


    • ๐Ÿ‘Œ Support aeson-1.0 (@phadej)
    • ๐Ÿ‘Œ Support http-client-0.5 (@phadej)
    • Safer installation from source in INSTALL.md (@hdgarrood)


    • ๐Ÿ›  Fix most HLint warnings (@ianbollinger)
    • ๐Ÿ›  Fixing imports (@charleso)
    • Export desugarDecl from Sugar.ObjectWildcards (@rvion)
    • โœ‚ Remove legacy ObjectGetter and update doc (@rvion)