The fewer type parameters in a class, the better. Can you turn any into associated types? Can you split the class into two classes? Can you hive off some of the parameters into a superclass?
Don't worry about strictness until it's time to optimize.
Intuition about optimization tends to be bad. Before profiling, limit yourself to reasoning about complexity classes.
Don't judge haskell based on these definitions. They appear strange and crazy, but when you actually do stuff most of them turn out to be quite intuitive.
Advice is to ignore these things. Don't read a million monad tutorials. Just play around and code something, you don't have to understand the monad-definition before you can use the do-notation. Try to ignore them. After a while you get an intuition and then the definitions will make sense.
Objects are a way to generalize reusability and composability (Interheritance, Encapsulation, Polymorphism) Haskell goes down a different route of reusability and composability that draws more from math than from object models. The real benefit to learning haskell is learning to think in that way rather than an object oriented or imperative way.
In Haskell, you could say that the type system is a syntactic method for classifying program phrases according to the kinds of values they compute.
Because Haskell (usually) only evaluates into WHNF if you produce data constructors while doing the infinite recursion you can use infinite recursion.
If, while forcing a thunk, you see the same thunk being forced again, you can report infinite recursion.
GADTs might give you a radically simple way to express things that rudimentary type systems like Go's cant express.
Haskell's type system lets you express a lot of domain specific invariants and logic in a statically verifiable manner.
Go is as type safe as haskell, the language doesn't allow invalid operations on data types. What people mean with "weak" is often expressivity. Go's enums sucks and it doesn't have ADTs or generic.
When people talk about strong type system, they usually just mean expressivity, not safety.
Well typed programs
Separation of IO and logic
Data is "transformed" using functions and function compositions
It has do-notation, which resembles statements if you don’t squint too hard. But Haskell has very few syntactic elements, so there is no need to worry about disambiguating between e.g. a; [b].c and a[b].c like there is in Rust.
Haskell IDE Engine - Engine for haskell ide-integration.
Haskell companies - Curated list of companies using Haskell in industry.
Snack - Nix-based incremental build tool for Haskell projects.
Fused effects - Fast, flexible, fused effect system for Haskell.
haskell-lsp - Haskell library for the Microsoft Language Server Protocol.
Haskell Source Extensions - Package for handling and manipulating Haskell source code.
Hedgehog - Modern property-based testing system, in the spirit of QuickCheck.
brittany - Haskell source code formatter.
Stack - Cross-platform program for developing Haskell projects.
hpack - Modern format for Haskell packages.
Haskell Code Explorer - Web application for exploring and understanding Haskell codebases.
static-haskell-nix - Easily build most Haskell programs into fully static Linux executables.
Koka - Function-oriented language with effect inference.
Write You a Haskell - Building a modern functional compiler from first principles.
Write You a Haskell 2 - Continuation of Steven Diehl's Write You a Haskell.
Hoogle - Haskell API search engine.
ghcide - Library for building Haskell IDE tooling.
llvm-hs - Haskell bindings for LLVM.
Releaser - Automation of Haskell package release process.
CodeWorld - Educational computer programming environment using Haskell.
Summoner - Tool for scaffolding batteries-included production-level Haskell projects.
GHC exercises - Little course to learn about some of the more obscure GHC extensions.
Aelve Guide | Haskell - Wiki-like guide to Haskell ecosystem and community.
rien - Predictable Haskell development environments with Cabal and Nix.
HaskellR - Full power of R in Haskell.
Haskell Profile Highlight - Color highlighting for Haskell profiling information.
Retrie - Powerful, easy-to-use codemodding tool for Haskell.
haskell-language-server - Integration point for ghcide and haskell-ide-engine. One IDE to rule them all.
Haskell Platform - Combination of the GHC compiler and core libraries, plus additional tools and libraries covering a range of common programming tasks.
Software Design and Architecture in Haskell - Structured set of materials. How to build real-world applications in Haskell. (Other resources that are good, but not necessarry about Software Design)
nix-hs - Thin layer over the existing Haskell infrastructure in nixpkgs which adds all of the tools needed for interactive development.
Smuggler2 - Minimise haskell imports, make exports explicit.
cabal-edit - Utility for managing Hackage dependencies from the command line.
ruHaskell - Russian Haskell community.
apply-refact - Refactor Haskell source files.
LiquidHaskell - Liquid Types For Haskell.
Haskell Playground - Number of partially finished math-related projects in Haskell.
Haskell IDE Engine for Nix - Provides cached Nix builds for Haskell IDE Engine.