Skip to main content
punctuation, grammar
Source Link
Matthias Braun
  • 34.8k
  • 27
  • 158
  • 177
  • Use the type system to enforce abstractions, simplifying interactions.
  • Enforce key invariants via types * (e.g. that certain values cannot escape some scope) * That certain code does no IO, does not touch the disk
  • Enforce safety: checked exceptions (Maybe/Either), avoid mixing concepts (Word,Int Int,Address Address)
  • Good data structures (like zippers) can make some classes of testing needless, as they rule out e.g. out of bounds errors statically.
  • Provide objective evidence of your programsprogram's heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no unnecessary memory use.
  • QuickCheck + Haskell Code Coverage, to ensure you are testing the things you can't check with types.
  • GHC +RTS+ RTS is great for seeing if you're spending too much time doing GC.
  • QuickCheck can also help you identify clean, orthogonal APIs for your modules. If the properties of your code are difficult to state, they're probably too complex. Keep refactoring until you have a clean set of properties that can test your code, that compose well. Then the code is probably well designed too.
  • Use the type system to enforce abstractions, simplifying interactions.
  • Enforce key invariants via types * (e.g. that certain values cannot escape some scope) * That certain code does no IO, does not touch the disk
  • Enforce safety: checked exceptions (Maybe/Either), avoid mixing concepts (Word,Int,Address)
  • Good data structures (like zippers) can make some classes of testing needless, as they rule out e.g. out of bounds errors statically.
  • Provide objective evidence of your programs heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no unnecessary memory use.
  • QuickCheck + Haskell Code Coverage, to ensure you are testing the things you can't check with types.
  • GHC +RTS is great for seeing if you're spending too much time doing GC.
  • QuickCheck can also help you identify clean, orthogonal APIs for your modules. If the properties of your code are difficult to state, they're probably too complex. Keep refactoring until you have a clean set of properties that can test your code, that compose well. Then the code is probably well designed too.
  • Use the type system to enforce abstractions, simplifying interactions.
  • Enforce key invariants via types * (e.g. that certain values cannot escape some scope) * That certain code does no IO, does not touch the disk
  • Enforce safety: checked exceptions (Maybe/Either), avoid mixing concepts (Word, Int, Address)
  • Good data structures (like zippers) can make some classes of testing needless, as they rule out e.g. out of bounds errors statically.
  • Provide objective evidence of your program's heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no unnecessary memory use.
  • QuickCheck + Haskell Code Coverage, to ensure you are testing the things you can't check with types.
  • GHC + RTS is great for seeing if you're spending too much time doing GC.
  • QuickCheck can also help you identify clean, orthogonal APIs for your modules. If the properties of your code are difficult to state, they're probably too complex. Keep refactoring until you have a clean set of properties that can test your code, that compose well. Then the code is probably well designed too.
syntax mistake fix
Source Link
scadge
  • 9.8k
  • 5
  • 33
  • 43
  • Provide objective evidence of your programs heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no uneccessaryunnecessary memory use.
  • Provide objective evidence of your programs heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no uneccessary memory use.
  • Provide objective evidence of your programs heap and time profiles.
  • Heap profiling, in particular, is the best way to ensure no unnecessary memory use.
Work around dead links on galois.com
Source Link
JB.
  • 42.5k
  • 13
  • 83
  • 109

I talk a bit about this in Engineering Large Projects in HaskellEngineering Large Projects in Haskell and in the Design and Implementation of XMonad. Engineering in the large is about managing complexity. The primary code structuring mechanisms in Haskell for managing complexity are :

I talk a bit about this in Engineering Large Projects in Haskell and in the Design and Implementation of XMonad. Engineering in the large is about managing complexity. The primary code structuring mechanisms in Haskell for managing complexity are :

I talk a bit about this in Engineering Large Projects in Haskell and in the Design and Implementation of XMonad. Engineering in the large is about managing complexity. The primary code structuring mechanisms in Haskell for managing complexity are :

Recommend Stack
Source Link
Elliot Cameron
  • 5.3k
  • 2
  • 30
  • 37
Loading
fix typos
Source Link
Alex
  • 8.4k
  • 8
  • 55
  • 80
Loading
Loading
minor spelling + punctuation fixes; add link.
Source Link
Loading
Forgot hlint.
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading
Integrate stuff from xmonad experience
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading
Refactoring and types.
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading
More on purity
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading
added 78 characters in body
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading
Source Link
Don Stewart
  • 138.1k
  • 36
  • 372
  • 471
Loading