As this is a small academic project, we do not have any strict rules on how you can contribute to Issy. The easiest way to get into this is to email Philippe or Rayna. However, to make things as accessible as possible, we want to lay out how the project is structured and what standards (we try to) maintain.
You might want to start by building the HTML version of the documentation. The first time you do this, run
stack haddock --haddock-internal
This will build the full haddock documentation. After that, you can run
make documentation
which will build the documentation for all of Issy's internal modules.
If you do not know where to start looking exactly, you can start by exploring from the Issy, Issy.Logic.FOL, Issy.Solver.ObjectiveSolver, and Issy.Prelude modules. Those cover important modules for different parts of the project.
We try to maintain a certain standard for code style and want to incentivize you to do the same. The main goal is to make the code future-proof and prevent academic code rot. In addition, one needs to keep in mind that not everybody who wants to work with this might be a Haskell expert.
-
Documentation: We use haddock for documentation. Every module should have a documentation header, and all exports should be documented.
-
Formatting: In order to keep the code in a uniform style, we use the hindent auto-formatter with a line length of 100. You can format the entire codebase by running
make format. Try to use the newest version of hindent. -
Linting: We use hlint for linting. You can run the pre-configured version of linting by running
make lint. All suggestions from hlint for this configuration should be implemented. -
Imports/exports: All modules should explicitly indicate what they export. Imports should, in almost all cases, be either an explicit import list or qualified, with
Issy.Preludebeing a notable exception. When doing qualified imports, use a short name instead of a long one, e.g.,Setinstead ofData.Set. For common data structures likeMaporSet, the functions should usually be imported qualified. Seldom can a module be imported unqualified without explicit imports if it is a data module for a sub-part that is not used outside of this. -
Safe Haskell: All modules that are part of Safe Haskell should be marked as such with the
SAFElanguage pragma. -
Language Extensions: We try to limit the use of language extensions to ones that provide simple syntactic extensions like
LambdaCaseorMultiWayIf. Extensions that extend the type-system or feature set significantly, likeImplictParametersorTemplateHaskell, should be avoided wherever possible.