haskell-names alternatives and similar packages
Based on the "Language" category.
Alternatively, view haskell-names alternatives based on common mentions on social networks and blogs.
-
elm-compiler
Compiler for Elm, a functional language for reliable webapps. -
purescript
A strongly-typed language that compiles to JavaScript -
stylish-haskell
Haskell code prettifier [Moved to: https://github.com/haskell/stylish-haskell] -
haskell-src-exts
Manipulating Haskell source: abstract syntax, lexer, parser, and pretty-printer -
haskell-tools-ast-fromghc
Developer tools for Haskell -
liquid-fixpoint
Horn Clause Constraint Solving for Liquid Types -
language-python
A parser for Python 2.x and 3.x written in Haskell -
elm-export
Create Elm types and JSON decoders from Haskell source. -
nirum
Nirum: IDL compiler and RPC/distributed object framework for microservices -
shentong
A Haskell implementation of the Shen programming language. -
tal
An implementation of Typed Assembly Language (Morrisett, Walker, Crary, Glew) -
camfort
Light-weight verification and transformation tools for Fortran -
language-c-quote
C/CUDA/OpenCL/Objective-C quasiquoting library. -
language-rust
Parser and pretty-printer for the Rust language -
language-ecmascript
Haskell library: ECMAScript parser, pretty-printer and additional tools -
aterm-utils
Utility functions for working with aterms as generated by Minitermite -
ministg
Ministg is an interpreter for a high-level, small-step, operational semantics for the STG machine. -
purescript-tsd-gen
TypeScript Declaration File (.d.ts) generator for PureScript
WorkOS - The modern identity platform for B2B SaaS
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of haskell-names or a related project?
README
haskell-names
haskell-names does name and module resolution for haskell-src-exts AST.
Namely, it can do the following:
- For a list of modules, compute the list of symbols each module exports.
This is called
resolve
. - For each name in a module, figure out what it refers to — whether it's bound
locally (say, by a
where
clause) or globally (and then give its origin). This is calledannotate
.
Installation
If you're building a development version, then you might also need to install a development version of haskell-src-exts.
Environments
An environment is a map from module name to list of symbols the module exports.
Symbols are for example types, classes, functions etc. We persist these lists in
a JSON format.
For example, here are a couple of entries from Prelude.names
:
[
{
"name": "map",
"entity": "value",
"module": "GHC.Base"
},
{
"name": "IO",
"entity": "newtype",
"module": "GHC.Types"
},
...
]
As you see, each entity is annotated with the module where it was originally defined. Additionally, class methods, field selectors, and data constructors are annotated with the class or type they belong to.
haskell-names
provides functions readSymbols
and writeSymbols
to read and write interface files.
Name resolution
The annotate
function annotates the given module with scoping information.
Its essence is described in the article Open your name resolution.
Examples
The example in examples/HeadUsage.hs
shows how you would find out if a
Haskell modules given on stdin uses Prelude.head
.
% cabal exec -- runghc examples/HeadUsages.hs
one = head [1]
^D
Prelude.head is used at stdin: (1:7) - (1:11)
% cabal exec -- runghc examples/HeadUsages.hs
import Prelude hiding (head)
import Data.Text
f = head (pack "foo")
^D
Congratulations! Your code doesn't use Prelude.head
The example in examples/ModuleExports.hs
shows how the resolve
function
behaves. It expects to find examples/moduleexports.Example.hs
and
examples/moduleexports/Example/Internal.hs
.
% cabal exec -- runghc examples/ModuleExports.hs
Only example: fromList [(ModuleName () "Example",[])]
Only internal: fromList [(ModuleName () "Example.Internal",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}])]
Example & Internal: fromList [(ModuleName () "Example",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}]),(ModuleName () "Example.Internal",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}])]
Internal & Example: fromList [(ModuleName () "Example",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}]),(ModuleName () "Example.Internal",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}])]
Example after Internal: fromList [(ModuleName () "Example",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}]),(ModuleName () "Example.Internal",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}])]
Internal after Example: fromList [(ModuleName () "Example",[]),(ModuleName () "Example.Internal",[Value {symbolModule = ModuleName () "Example.Internal", symbolName = Ident () "details"}])]
API documentation
The core module you need is Language.Haskell.Names
Other modules are more experimental, less documented, and you probably don't need them anyway.
Known issues
See the list of all issues.
- haskell-names doesn't perform validation yet. If a module is not valid Haskell, then the behaviour is undefined. See the issues marked as validation.
- Symbol fixities are not recorded (#1)
- Type variables are not resolved (#2)
- Arrows are not fully supported (#8)
Maintainers
Philipp Schuster is the primary maintainer.
Adam Bergmark is the backup maintainer. Please get in touch with him if the primary maintainer cannot be reached.