https://en.wikipedia.org/wiki/Haskell
Some Haskell-related services I operate:
https://haskell-links.org - efficient overview and search for Haskell links (crowd-managed via lambdabot)
https://haskell-status.joyful.com - fast-updating accurate uptime info for the Haskell ecosystem
FAQs:
### What is Haskell good for ?
It's good when you want to design and build software that's correct, robust, and long-term maintainable.
Also that's pretty fast, quick-starting, and portable.
It's also very good for writing concurrent software.
> Q: very vague and common question but like in general, what is haskell specialized for? Like C and Rust are good for systems programming, but idk what haskell is good for
>
> \<sm> it's a language good for many things but people usually get most benefit when you need high quality/high assurance; high expressiveness for implementing complex logic; and/or high maintainability for medium/large codebases over medium/long term\
> \<sm> currently it's often seen in fintech, as the backend for web apps, and for implementing/processing languages\
> \<sm> also, of course, it's very good for teaching and research\
> \<sm> some people learn it early but I think it is most appreciated by experienced software developers\
> \<sm> "an expressive, powerful language for building high quality long lasting software at low cost"\
> \<sm> "as long as the sponsors and spare time volunteers work to keep old GHC versions and deps building on your platform"....\
> \<sm> people often say that knowing a little haskell helps them think/program more clearly in any language\
> \<sm> that's true for me certainly. Haskell is perhaps the best place to learn the functional programming style
### What Haskell apps are out there ?
The [Cardano blockchain](https://iohk.io/en/products) is one of the most visible large-scale public apps.
%% See it operating here: https://pooltool.io/networkhealth %%
Cardano's [Daedalus wallet](https://daedaluswallet.io) is another.
The [pandoc](https://pandoc.org) document converter is the best-known command line app written in Haskell.
Here's a [ranking of haskell repos on github by stars](https://github.com/EvanLi/Github-Ranking/blob/master/Top100/Haskell.md).
Summaries as of 2025-01:
**Non software development apps**
- pandoc (35k)
- kmonad keyboard manager, xmonad window manager, hledger accounting app, cardano blockchain, Simula VR desktop (3k)
- echidna ethereum contract fuzzer, hakyll site generator, wire chat server, xdg-ninja $HOME cleaner, patat presentation tool, gitit wiki, dapptools ethereum tools (2k)
Some more:
- SimpleX chat (7k)
- ImplicitCAD (1k)
**Software development apps, not specifically about the Haskell language**
- shellcheck shell script checker (35k)
- postgrest REST API server (24k)
- hadolint dockerfile checker (10k)
- semantic code analyser (9k)
- purescript language (8k)
- elm language (7k)
- unison, Carp languages (5k)
- IHP web framework, Haxl remote client library, duckling language (4k)
- Kind language, Idris language, koka language (3k)
- yesod web framework, eta language, agda language, futhark language, corrode c/rust translator (2k)
Here's another [ranking by github stars](https://github.com/search?o=desc&q=language%3AHaskell+stars%3A%3E%3D1000&ref=searchresults&s=stars&type=repositories )
[Top non-programming-related haskell apps ?](https://www.reddit.com/r/haskell/comments/eddwbu/top_nonprogrammingrelated_haskell_apps/) (reddit, 2019)
[What are the best real world applications developed with Haskell?](https://www.reddit.com/r/haskell/comments/2wicxt/what_are_the_best_real_world_applications/) (reddit, 2015)
### What else is Haskell used for ?
Some other notable or common uses of Haskell:
- scanning posts for spam at Facebook
- analysing code at Github
- building programming languages and tools
- fintech
- cryptocurrency
- web apps
- command line tools
- research
- teaching and learning
See also:
- https://haskellcosm.com
- https://wiki.haskell.org/Haskell_in_industry
- [11 Companies That Use Haskell in Production](https://serokell.io/blog/top-software-written-in-haskell)
- [Open-Source Haskell: 29 Awesome Projects, Tools, and Libraries](https://serokell.io/blog/best-haskell-open-source-projects)
- [What is Haskell used for in the real world?](https://stackoverflow.com/questions/1604790/what-is-haskell-used-for-in-the-real-world) (stack overflow, 2020)
- https://www.quora.com/What-are-some-real-world-examples-of-large-apps-that-have-been-written-entirely-in-Haskell-or-other-pure-functional-language
- https://www.quora.com/What-are-some-real-world-applications-of-Haskell
### When shipping files with your app, why should you avoid Cabal's Paths_pkgname feature ?
[Cabal User Guide > Package Description > Accessing data files from package code](https://cabal.readthedocs.io/en/stable/cabal-package-description-file.html#accessing-data-files-from-package-code) describes a way to package data files with your app. You declare them as `data-files:` in the apps's .cabal file, and then you can import helpers from a special `Paths_pkgname` module, which can read the files.
However, you should avoid this, because it is inherently fragile:
1. The files will be accessible only if the app was installed in the right way: building/installing it from source with `cabal install` or `stack install` (or installing binary + data files with `nix`) ..
2. They will be installed somewhere like
`~/.cabal/store/ghc-9.4.8/...fcfc097/`, which is not a durable place for essential data. Typically,
this gets wiped when you uninstall old ghc versions,
or when your disk fills up,
or when you have an unsolvable cabal/haskell setup problem;
or it gets excluded from backups, so won't be there when you restore;
or if you copy executables to a new machine, the data won't come along.
3. And once any of these files become inaccessible, the app will no longer run.
What to do instead ? One good option at least for smallish files is to embed them in your executable, which makes it much more self-contained, packageable, and robust. The easiest way is using the [file-embed](https://hackage.haskell.org/package/file-embed) library. ([Other embedding libs](https://hackage.haskell.org/packages/search?terms=embed) exist also.) At runtime, instead of reading files from the file system, you use file-embed's API, eg [embedFileRelative](https://hackage.haskell.org/package/file-embed-0.0.16.0/docs/Data-FileEmbed.html#v:embedFileRelative). The type signature is confusing here, but basically it evaluates to a bytestring ([example](https://github.com/simonmichael/hledger/blob/9d4db48510a0e6df4c127ff9751db44ed2066950/hledger/Hledger/Cli/DocFiles.hs#L47)). In cases where you absolutely need real files, eg when a helper app requires that, you can write them out to a temp file at runtime ([example](https://github.com/simonmichael/hledger/blob/9d4db48510a0e6df4c127ff9751db44ed2066950/hledger/Hledger/Cli/DocFiles.hs#L103)).
### Haskell code style
I strongly favour ignoring the 80 char line length convention, and using longer lines when needed (within reason), with line wrapping usually turned off (ie, with too-long lines truncated). Because seeing clear code structure, and more of it, is much more valuable than fitting in narrow horizontal space. I usually don’t need to be seeing the end of every line, instead I want to see more of the program. When I do want to see line ends, it’s easy to temporarily maximize a window, scroll, or toggle line wrap.
https://discourse.haskell.org/t/supercedes-house-style-for-haskell/11297/16
### stack and ghcup
If using both stack and ghcup, to avoid wasting space and time it's important to 1. tell stack it can use ghcup's GHCs and need not install GHC itself, and 2. clean up any old stack-installed GHCs (manually, or with a tool like stack-clean-old or ncdu).
When you install stack with ghcup, it offers to configure stack that way for you. Otherwise, here's how to configure it: https://www.haskell.org/ghcup/guide/#stack-integration .
Strategy 1 there allows stack to do its usual job of requesting a GHC version compatible with the project you are building (the one requested by the project's stack.yaml, otherwise one compatible with the bounds in the cabal files).
Strategy 2 turns that off so it will just try whatever GHC is in PATH.
### ghci, ghc-pkg, ... doesn't see an install package
If you're inside a project, prepending the command with `cabal exec --` or `stack exec --` is often a quick fix. cabal and stack also have `repl`/`ghci` commands which are more fiddly.