A strongly-typed language that compiles to JavaScript
OTHER License
Bot releases are visible (Hide)
Published by paf31 about 8 years ago
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
Data.Newtype
Deriving(@garyb)
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.
(@FrigoEU)
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 <>
--dump-corefn
(@rightfold)
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.
(@paf31)
It is now possible to derive type class instances for newtype
s, 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.
_.a.b
)(@rvion)
Anonymous record accessor syntax has been extended to work with chains of one or more accessors:
getBaz = _.foo.bar.baz
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:
psc-bundle
(@kRITZCREEK)UnusedDctorImport
warning (@FrigoEU)$
and #
operators (@garyb)everywhereOnTypesTopDown
(@ianbollinger)aeson-1.0
(@phadej)http-client-0.5
(@phadej)desugarDecl
from Sugar.ObjectWildcards
(@rvion)ObjectGetter
and update doc (@rvion)Published by paf31 about 8 years ago
Published by paf31 about 8 years ago
Published by paf31 over 8 years ago
@kRITZCREEK has added the ability to return position information for expressions in psc-ide
. This can be used to implement a Goto Definition feature in IDEs which use psc-ide-server
as the backend.
(@paf31)
PSCi now features an alternative backend, which can run commands in the browser via a websocket. To use this mode, simply pass the --port
option on the command line:
$ pulp psci --port 9000
and open your web browser to localhost
on that port.
See https://github.com/paf31/psci-experiment for a demonstration.
psc-ide
architecture changes@kRITZCREEK has worked on changing the architecture of psc-ide
generally, to load data in multiple phases and asynchronously. This enables new features like Goto Definition above.
pipes
version 4.2 (@felixonmars)psc-ide
Published by paf31 over 8 years ago
PureScript 0.9.1 is a major stable release of the compiler. It removes features which were deprecated in the 0.8.x series, and contains several useful enhancements and bug fixes.
This release will be accompanied by new releases of the core libraries and a compatible version of Pulp, which have been updated to work with this version.
Due to the relatively large number of breaking changes, library authors are advised that they will probably need to update their libraries to maintain compatibility. Users may prefer to continue using version 0.8.5 until their dependencies have been updated.
(@garyb)
The way names are resolved has now been updated in a way that may result in some breakages. The short version is: now only names that have been imported into a module can be referenced, and you can only reference things exactly as you imported them.
Some examples:
Import statement | Exposed members |
---|---|
import X |
A , f
|
import X as Y |
Y.A Y.f
|
import X (A) |
A |
import X (A) as Y |
Y.A |
import X hiding (f) |
A |
import Y hiding (f) as Y |
Y.A |
Qualified references like Control.Monad.Eff.Console.log
will no longer resolve unless there is a corresponding import Control.Monad.Eff.Console as Control.Monad.Eff.Console
. Importing a module unqualified does not allow you to reference it with qualification, so import X
does not allow references to X.A
unless there is also an import X as X
.
Although the new scheme is stricter it should be easier to understand exactly what the effect of any given import statement is. The old resolution rules for qualified names were obscure and unexpected results could arise when locally-qualified module names overlapped with "actual" module names.
Module re-exports have also been tightened up as a result of these rules. Now if module X
is only imported as Y
, the re-export must list module Y
also. If a module is imported without being re-qualified then the original name is used.
(@garyb, @paf31)
The compiler will now generate an error for a missing Partial
constraints, where it would previously have issued a warning.
(@garyb, @paf31)
These restrictions will allow us to improve incremental build times in future, since we will only need to parse a small prefix of each file in order to figure out what needs to be rebuilt. Right now, we need to parse every file fully.
(@paf31)
Foreign modules are now found by filename rather than by searching for a custom JavaScript comment. The foreign module is found by changing the extension of the corresponding PureScript module from .purs
to .js
.
This change was made to be more consistent with psc-ide
, and also to adopt a simple convention which will port well to other backends.
(@garyb)
All operators must be defined as aliases from now on. That is, it is no longer valid to define an operator as a name in local scope (e.g. let (#) x y = x y in ...
). This change makes it possible to generate better JavaScript code for operators, by desugaring them to the functions they alias.
Deprecated class import/export syntax has been removed (@LiamGoodacre). Classes are now imported using the class
keyword, and exported similarly:
import Prelude (class Show, show)
Remove support for =
in record binders (@paf31).
Record binders such as
f { x = 0 } = true
are no longer supported. Record binders must now use :
instead:
f { x: 0 } = true
Prim.Object
has been renamed to Prim.Record
(#1768, @paf31)
(@paf31)
Constraints can now contain type-level strings which can be used as custom error messages using the Fail
constraint. For example, one can now document the fact that foreign types such as JSDate
cannot be made instances of Generic
:
instance dateIsNotGeneric
:: Fail "JSDate is not Generic. Consider using Int with toEpochMilliseconds instead."
=> Generic JSDate where
fromSpine = crashWith "fromSpine: unreachable"
toSpine = crashWith "toSpine: unreachable"
toSignature = crashWith "toSignature: unreachable"
Attempting to derive a Generic
instance for a type containing JSDate
will then result in
A custom type error occurred while solving type class constraints:
JSDate is not Generic. Consider using Int with toEpochMilliseconds instead.
(#2070, @paf31)
Typed hole error messages now include the types of any names in scope, to assist with type-driven development:
> :t \x -> maybe 0 ?f x
Error found:
in module $PSCI
at line 1, column 8 - line 1, column 22
Hole 'f' has the inferred type
t0 -> Int
in the following context:
it :: Maybe t0 -> Int
x :: Maybe t0
in value declaration it
where t0 is an unknown type
psc-ide
, which improves completion support for editor plugins. (@kRITZCREEK)reset
command was added to psc-ide
(@kRITZCREEK)MissingTypeDeclaration
and TypeWildCard
warnings (@nwolverson)(@paf31)
psc-ide
. This means that the :load
and :foreign
commands have been removed, since dependencies are fixed and pre-compiled when PSCi loads.purescript-psci-support
for its supporting code.Types and values will now be highlighted in error messages, when the terminal supports it (MacOS and Linux for now) (@soupi).
Prime characters are now allowed in type names. (@garyb)
(..)
(@garyb):show import
were fixed (@LiamGoodacre)psc-ide
(#2064, @kika)psc-publish
were improved (@hdgarrood)main
function (@hdgarrood)NoImplicitPrelude
and enable some global extensions (@garyb)Published by paf31 over 8 years ago
This is pre-release software
This release is provided so that library developers can test the new compiler features.
Published by paf31 over 8 years ago
Fast recompilation for single files in psc-ide-server
#1712 (@kRITZCREEK, @paf31)
The pscid
project makes use of this to watch files as you work and raise errors and warnings when they occur with near instant feedback.
Operator aliases can now be declared for types #416 (@garyb)
infixr 6 type Natural as ~>
Underscore wildcards can now be used in case
and if
expressions #1558 (@garyb)
case _ of
Something -> ...
-- underscores can optionally be used in any part of an `if` expression
cond = if _ then _ else _
picker = if _ then "x" else "y"
Typed holes #1283 (@garyb)
example :: forall a. Maybe a -> Unit
example ma = ?umm
Hole 'umm' has the inferred type
Unit
in value declaration example
You can use any identifier name after the question mark and that will be used to label the hole in the raised error message.
x :: a == y
will be now parsed as x :: (a == y)
instead of (x :: a) == y
.psc-publish
now allows publishing of packages with a valid SPDX license field in bower.json
#1985 (@hdgarrood)psc-ide
now creates the output
folder on startup if it is missing #2030 (@kRITZCREEK)DuplicateSelectiveImport
would not fire when it should #2004 (@garyb)hiding
import will no longer raise an "unspecified imports" error #2017 (@garyb)psci
now shows qualified imports correctly #2040 (@LiamGoodacre)Published by paf31 over 8 years ago
This is an interim bug fix release before 0.9.0.
Check that FFI imports match with implementations (@hdgarrood)
This is technically a breaking change, since some existing code might fail to compile if it has missing FFI code (purescript-dom
is an example), but these libraries should be fixed soon.
Import helper commands in psc-ide (@kRITZCREEK)
Published by paf31 over 8 years ago
Infer types with class constraints (@paf31)
For example, this simple code would previously have failed with a confusing NoInstanceFound
error:
add x y = x + y
The compiler will now infer the most general type, namely forall a. (Semiring a) => a -> a -> a
.
Note that constraints can only be inferred if they only mention type variables; inference of arbitrary types in constraints is not (yet) supported. So, for example, you would still have to write a type signature for a function which had a constraint such as (MonadEff (console :: CONSOLE | eff) m)
.
Default require path to ../
(@nwolverson)
The previous default behavior was no require path prefix, which was confusing for some workflows. The new default is ../
, which is the prefix used in purs-loader
. This option will be removed completely in 0.9.
Expose hiding import suggestion in JSON (@nwolverson)
Error on missing LICENSE
file or missing license field in bower.json
(@faineance)
true
not being treated as an infallible guard (@garyb)--help
commands to the psc-ide
executables (@kRITZCREEK)acceptCommand
(@kRITZCREEK)optparse-applicative
dependency was updated to >= 0.12.1
(@stevejb71)bower-json
dependency was bumped (@hdgarrood)psc-publish
tests (@kRITZCREEK)Published by paf31 over 8 years ago
None
psc-ide
is now distributed with the compiler! (@kRITZCREEK)
The psc-ide-server
and psc-ide-client
executables are now maintained and
distributed alongside the compiler. This will ensure that the externs file
format used by psc-ide-server
is kept in sync with changes in the compiler.
Source maps (@nwolverson)
Source maps can be generated using the --source-maps
flag. See the
example repository for a full demonstration of source maps using Webpack.
Operator aliases for data constructors (@garyb)
Aliases can now be defined for data constructors. For example:
data List a = Nil | Cons a (List a)
infixr 6 Cons as :
Here, the :
operator can be used as a function to replace the Cons
constructor,
and also in binders.
Eq
and Ord
deriving (@paf31)
Eq
and Ord
instances can now be derived, using the derive instance
syntax:
derive instance eqList :: (Eq a) => Eq (List a)
derive instance ordList :: (Ord a) => Ord (List a)
Types are now inferred in psc-docs
and psc-publish
(@hdgarrood)
If type annotations are missing in source files, they will be inferred by
psc-docs
and psc-publish
before documentation generation.
Initial version of new syntax for operator sections (#1846, @paf31)
Operator sections can now be written using underscores. For example:
decrementAll :: Array Int -> Array Int
decrementAll = map (_ - 1)
which is equivalent to:
decrementAll :: Array Int -> Array Int
decrementAll = map (\x -> x - 1)
Allow one open import without warning (@garyb)
Warnings for open imports were a pain point for some users after the 0.8 release.
This change allows a single open import without a warning. This is still safe
in the presence of dependency updates, and does not lead to ambiguity for editor
plugins searching for declaration sites.
Published by paf31 over 8 years ago
You are recommended to use v0.8.2 instead.
Published by paf31 over 8 years ago
A massive thanks to everyone involved in this release!
None, but there are lots of new warnings related to upcoming breaking changes in 0.9:
Partial
constraint in 0.9, so the exhaustivity checker will now attempt to generate warnings by looking for Partial
constraints in scope.qualified
import syntax has been deprecated.class
syntax in 0.9 and the alternative syntax is deprecated.Partial
constraint (@garyb)--json-errors
flag for editor integrations (@paf31)--json-errors
(@nwolverson)forall
and function arrows (@DavidLindbom)class
keyword for class references in imports (@garyb)()
(@garyb)foreign
argument to fix compiling issue (@anttih)Published by paf31 almost 9 years ago
Published by paf31 almost 9 years ago
Fixes a bug in generic deriving.
See the release notes for 0.7.6.
Published by paf31 almost 9 years ago
Thanks once again to everyone involved in this release!
This release includes some updates to generic deriving which require updating to the latest version of purescript-generics
.
Field puns, fix #921 (@balajirrao)
It is now possble to construct objects by using values in scope with the same name as the field labels. For example, the expression { foo, bar }
is equivalent to { foo: foo, bar: bar }
. Patterns desugar in the same way.
Types.Proxy.Proxy
instead of Data.Generic.Proxy
. This fixes #1573 (@tfausak)purescript-generics
changes (@paf31)psc-publish
: only warn on dirty working tree on dry runs (@hdgarrood)base-compat
to reduce the need for CPP
(@phadej)Published by paf31 almost 9 years ago
Published by paf31 almost 9 years ago
Fixes a build issue with GHC versions < 7.10. Functionally equivalent to v0.7.5.1.
Published by paf31 almost 9 years ago
Published by paf31 almost 9 years ago
A big thank you to everyone who was involved in this release, from filing issues, through fixing bugs to testing patches.
The main focus areas for this release, as part of the 0.8 milestone, were error messages and performance.
None!
Pretty printing of types and expressions in errors was improved (@paf31)
Externs files are now saved as JSON (@paf31)
Support for parallel builds has been added (@paf31)
Builds will now use multiple cores by default, but the number of capabilities can be modified by passing the -N
option to the GHC runtime:
psc <input files> +RTS -N8
Binders can now be given type annotations (@5outh)
For example:
example = do
n :: Int <- get
put (n + 1)
This can be useful when disambiguating types.
There is a new warning for missing type signatures on top-level declarations (@paf31)
There are new warnings for shadowed and unused type variables (@garyb)
Contextual information in warnings was improved (@garyb)
The qualified
keyword is now optional when importing modules qualified (@michaelficarra)
@zudov changed the behavior of PSCi on CTRL+C/D to match GHCi and other REPLs.
A bug in row unification was fixed (#1310, @paf31)
Constrained types can now be defined without a forall
keyword. This is useful in some nullary type class and rank-N scenarios. (@paf31)
Published by garyb about 9 years ago
This patch release fixes two bugs related to the new instance resolution algorithm and overlapping instances:
psci
would not work due to overlaps in the PSCI.Support
modulefree
would not build due to its dependency on inject
The solution for now is to make overlapping instances into a warning (instead of an error) at the site of their use.
Later we might revisit this decision and allow the user to express classes like Inject
which are necessarily overlapping.