Welcome to Idris2!
==================
[Idris](https://www.idris-lang.org/) is a programming language designed to encourage
_Type-Driven Development_.
### Getting started
Once you have [installed Idris2](https://idris2.readthedocs.io/en/latest/tutorial/starting.html#getting-started)
you can write a simple hello-world by opening a `Main.idr` file and writing:
```idris
module Main
||| My first Idris2 function
main : IO ()
main = putStrLn "Hello, and welcome to Idris2!"
```
You can run this example by using the `--exec ENTRYPOINT` option.
The command `idris2 --exec main Main.idr` will compile the module and immediately run `main`.
The line starting with a triple pipe (`|||`) attaches documentation to the identifier. You
can consult it by loading the file in the REPL (`idris2 Main.idr`) and querying the compiler
using the `:doc` command: `:doc main` will return:
Main.main : IO ()
My first Idris2 function
Visibility: private
You should be able to use `:doc` on identifiers (e.g. `main`, `IO`, `()`, `putStrLn`, etc.) and
keywords (`module`, `:`, `=`, `private`, etc.) and hopefully get helpful information.
### Libraries shipped with the compiler
Here are links to the automatically generated documentation for the libraries shipped with the
**bleeding edge** version of the compiler. The documentation for the latest **released** version
is available on the [idris-lang.org](https://www.idris-lang.org/pages/documentation.html) site.
#### [Prelude](https://idris-lang.github.io/Idris2/prelude)
The `prelude` is always implicitly loaded unless you use the `--no-prelude` command-line option.
This is where the built-in types are bound, where the core data types (`List`, `Nat`, `Equal`, etc.)
and interfaces (`Eq`, `Show`, `Functor`, etc.) are defined.
#### [Base](https://idris-lang.github.io/Idris2/base)
`base` contains all the basics needed to write small programs. Its modules can be used by adding
an `import` statement to the top of your file.
In [`Data.List`](https://idris-lang.github.io/Idris2/base/docs/Data.List.html) for instance you
will find functions to `take` or `drop` values from a list, or `partition` it using a given predicate.
You can explore the content of a namespace like `Data.List` by using `:browse Data.List` in the REPL.
For more information about specific entries, you can then use `:doc`.
#### [Contrib](https://idris-lang.github.io/Idris2/contrib)
The `contrib` library contains a bit of everything. It will eventually be disbanded in favour of
third-party packages once we have a convenient package manager. To use modules defined in it, you
can pass the `-p contrib` option to `idris2`.
#### [Linear](https://idris-lang.github.io/Idris2/linear)
`linear` is the add-on to `base` you'll need for programs using linearity. Similarly to `contrib`,
you will need to pass `-p linear` to `idris2` to use modules defined in it.
#### [Network](https://idris-lang.github.io/Idris2/network)
`network` is the add-on to `base` you'll need for programs using sockets.
Similarly to `contrib` and `linear`, you will need to pass `-p network`
to `idris2` to use modules defined in it.
#### [Test](https://idris-lang.github.io/Idris2/test)
`test` is the add-on to `base` you'll need to write test suites.
Similarly to other add-ons, you will need to pass `-p test` to
`idris2` to use modules defined in it.
#### [Papers](https://idris-lang.github.io/Idris2/papers)
`papers` is not installed by default.
It contains complex examples that are lifted from academic papers using dependent typeds
and demonstrates advanced language features.