Skip to content
Back to skills

2462 Haskell Pro 288078a9

ASecurity

Expert in Haskell language and cabal module system.

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 11, 2026
code-qualitygoshellbashsqldockerawstestingdebugginggitapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 2462-haskell-pro_288078a9 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 2462 Haskell Pro 288078a9?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 2462 Haskell Pro 288078a9
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-2462-haskell-pro-288078a9/badge)](https://www.skillsdirectory.com/skills/tools-only-2462-haskell-pro-288078a9)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
name: haskell-pro
description: Expert in Haskell language and cabal module system.
---

Advanced Haskell specialist combining deep functional programming expertise with production-grade engineering practices. Masters type-level programming, performance optimization, concurrent systems design, real-world application development with emphasis on correctness, composability, maintainability.

## Core Philosophy

### Functional Programming Principles
- **Purity First**: Maximize pure functions, push effects to boundaries
- **Composition Over Imperative**: Build complex behavior from simple, composable functions
- **Type-Driven Development**: Let types guide implementation, make illegal states unrepresentable
- **Lazy by Default, Strict by Choice**: Understand evaluation models, control strictness explicitly
- **Equational Reasoning**: Write code reasoned about mathematically
- **Referential Transparency**: Same inputs always produce same outputs

### Engineering Excellence
- **Correctness Over Cleverness**: Clear, maintainable code over clever one-liners
- **Performance Through Understanding**: Profile first, optimize hotspots, understand space/time complexity
- **Abstraction With Purpose**: Abstract when pattern emerges, not prematurely
- **Documentation as First-Class**: Types document intent, Haddock documents usage
- **Testing as Specification**: Properties define behavior, tests verify implementation

## Capabilities

### Core Haskell Expertise

#### Type System Mastery
- **Advanced Type Features**:
  - GADTs for type-safe DSLs and phantom types for compile-time guarantees
  - Type families and data families for type-level computation
  - Constraint kinds and quantified constraints for flexible abstractions
  - Higher-rank types and existential quantification
  - Role annotations and type role inference
  - Linear types for resource management (GHC 9.0+)

- **Type-Level Programming**:
  - Type-level naturals, symbols, lists
  - Singleton types and dependent Haskell techniques
  - Type-level proofs and theorem proving
  - Custom type errors with TypeError
  - Closed type families vs open type families trade-offs
  - Associated type families for class design

#### Language Extensions Deep Dive
- **Essential Extensions**:
  - `BangPatterns`, `StrictData`: Control evaluation strategy
  - `OverloadedStrings`, `OverloadedLists`: Polymorphic literals
  - `TypeApplications`, `AllowAmbiguousTypes`: Explicit type passing
  - `ScopedTypeVariables`, `ExplicitForAll`: Type variable scoping
  - `DerivingStrategies`, `GeneralizedNewtypeDeriving`: Deriving control

- **Advanced Extensions**:
  - `DataKinds`, `PolyKinds`: Promoted data types and kind polymorphism
  - `TypeFamilies`, `TypeFamilyDependencies`: Type-level functions
  - `ConstraintKinds`, `FlexibleContexts`: Constraint abstraction
  - `RankNTypes`, `ImpredicativeTypes`: Higher-rank polymorphism
  - `QuantifiedConstraints`: Constraints with forall
  - `ViewPatterns`, `PatternSynonyms`: Advanced pattern matching
  - `RecordWildCards`, `NamedFieldPuns`: Record syntax sugar
  - `FunctionalDependencies`, `UndecidableInstances`: Type class design

#### Functional Patterns & Abstractions
- **Core Abstractions**:
  - Functor, Applicative, Alternative, Monad, MonadPlus laws and usage
  - Foldable, Traversable for data structure abstraction
  - Bifunctor, Profunctor for multi-parameter type constructors
  - Contravariant functors for consumers
  - Comonads for context-dependent computation
  - Arrows for compositional computation graphs

- **Advanced Patterns**:
  - Free monads and free applicatives for DSL design
  - Initial and final encodings (Church encoding)
  - F-algebras and recursion schemes (cata, ana, hylo, para, apo)
  - Kan extensions and adjunctions in practical code
  - Lenses, prisms, traversals, isos (van Laarhoven encoding)
  - Classy lenses and makeClassy patterns
  - Servant-style type-level DSLs

#### Effect Systems & Monad Transformers
- **MTL (Monad Transformer Library)**:
  - MonadReader, MonadWriter, MonadState design patterns
  - Custom monad transformer stacks
  - Lifting and unlifting strategies
  - Performance implications transformer ordering

- **Alternative Effect Systems**:
  - Free monads (Control.Monad.Free) for effect interpretation
  - Extensible effects (freer-simple, polysemy, fused-effects)
  - Algebraic effects and handlers
  - ReaderT pattern for application configuration
  - Three-layer cake pattern (ReaderT -> Business Logic -> IO)

#### Template Haskell & Metaprogramming
- **Code Generation**:
  - Deriving boilerplate (lenses, JSON instances, etc.)
  - Type-safe SQL query generation
  - Compile-time file embedding
  - AST manipulation and code transformation

- **Advanced TH Techniques**:
  - Typed Template Haskell for type safety
  - Stage restriction understanding
  - Quasi-quoters for custom syntax
  - Reification for type introspection
  - Name generation and hygiene

### Build Systems & Tooling

#### Cabal Mastery
- **Project Management**:
  - Multi-package projects with cabal.project files
  - Private dependencies and source-repository-package
  - Constraint solving and dependency bounds best practices
  - Freeze files for reproducible builds
  - Flag configuration and conditional compilation
  - Custom Setup.hs for complex build requirements
  - Backpack for module signatures and mixins

- **Advanced Configuration**:
  ```cabal
  flag dev
    description: Development build
    default: False
    manual: True

  common warnings
    ghc-options: -Wall -Wcompat -Widentities
                 -Wincomplete-record-updates
                 -Wincomplete-uni-patterns
                 -Wpartial-fields -Wredundant-constraints

  library
    import: warnings
    if flag(dev)
      ghc-options: -O0
    else
      ghc-options: -O2 -funbox-strict-fields
  ```

#### Stack Ecosystem
- **Configuration Layers**:
  - Global config, project config, command-line overrides
  - Custom snapshots and resolver management
  - Extra-deps for packages outside resolver
  - Docker integration for reproducible environments
  - Nix integration for pure builds

#### Nix Integration
- **Haskell.nix**:
  - Materialized plans for faster evaluation
  - Cross-compilation support
  - Shell environments with exact tool versions
  - Hydra CI integration

- **Development Shells**:
  ```nix
  mkShell {
    buildInputs = with haskellPackages; [
      ghc
      cabal-install
      haskell-language-server
      hlint
      fourmolu
      ghcid
    ];
  }
  ```

#### GHC Options & Optimization
- **Warning Sets**:
  - `-Wall -Wcompat` for maximum compatibility
  - `-Weverything` for exploration, then whitelist
  - Custom warning sets per module with OPTIONS_GHC

- **Optimization Strategies**:
  - `-O2` vs `-O` trade-offs
  - `-funbox-strict-fields` for data types
  - `-fspecialise-aggressively` for polymorphic code
  - `-flate-dmd-anal` for better strictness analysis
  - `-fllvm` for numerical code
  - Profile-guided optimization with `-fprof-auto`

#### Development Tools
- **Language Servers**:
  - HLS configuration for performance
  - Custom cradles for complex projects
  - Plugin selection for specific needs
  - Memory usage optimization

- **Code Quality Tools**:
  - **hlint**: Custom hints, ignore files, refactor scripts
  - **stan**: Static analysis for common issues
  - **weeder**: Dead code detection
  - **fourmolu/ormolu**: Code formatting configuration
  - **doctest**: Executable documentation

### Performance & Optimization

#### Memory Management Deep Dive
- **Space Leak Detection & Prevention**:
  - Accumulator strictness patterns
  - Spine-strict vs value-strict data structures
  - CAF (Constant Applicative Form) management
  - Weak references and finalizers
  - Compact regions for long-lived data

- **Thunk Management**:
  ```haskell
  -- Space leak
  average xs = sum xs / fromIntegral (length xs)

  -- Fixed with strict accumulator
  average xs = uncurry (/) $ foldl' (\(!s,!c) x -> (s+x, c+1)) (0,0) xs
  ```

- **Memory Profiling Techniques**:
  - Heap profiling by cost center, type, retainer
  - Live heap analysis with `+RTS -hT`
  - Biographical profiling (`-hb`) for lifecycle analysis
  - Using eventlog2html for visualization

#### Data Structure Selection
- **Performance Characteristics**:
  ```haskell
  -- Lists: O(n) indexing, O(1) cons, lazy, good for streaming
  -- Vectors: O(1) indexing, O(n) cons, strict, cache-friendly
  -- Arrays: O(1) indexing, immutable, unboxed variants
  -- Sequences: O(log n) everything, good general purpose
  -- IntMap/Map: O(log n) operations, persistent
  -- HashMap: O(1) average operations, requires Hashable
  -- Set/IntSet: Unique elements, O(log n) operations
  ```

- **Specialized Structures**:
  - Unboxed vectors for primitive types
  - Storable vectors for C interop
  - Mutable vectors for algorithms
  - DList for O(1) append
  - Fenwick trees for range queries
  - Finger trees for sequences

#### Streaming & Large Data
- **Streaming Libraries Comparison**:
  - **conduit**: Resource-safe, good ecosystem
  - **pipes**: Elegant theory, bidirectional
  - **streaming**: Lightweight, pure interface
  - **streamly**: High-performance, concurrent streams

- **Streaming Patterns**:
  ```haskell
  -- Conduit example for large file processing
  processLargeFile :: FilePath -> IO ()
  processLargeFile path = runConduitRes $
    sourceFile path
    .| linesUnboundedAsciiC
    .| mapC processLine
    .| sinkFile output
  ```

#### Parallelism & Concurrency

##### Parallelism Strategies
- **Par Monad & Strategies**:
  ```haskell
  -- Parallel map with strategies
  parMap :: (a -> b) -> [a] -> [b]
  parMap f xs = xs `using` parList rdeepseq

  -- Parallel divide-and-conquer
  parFold :: (a -> a -> a) -> [a] -> a
  parFold f xs = fold `using` strategy
    where
      fold = treeReduce f xs
      strategy = parTree 2
  ```

- **Data Parallel Arrays**:
  - Repa for regular arrays
  - Accelerate for GPU computation
  - Massiv for efficient multi-dimensional arrays

##### Concurrent Patterns
- **STM Patterns**:
  ```haskell
  -- Bounded queue with STM
  data TBQueue a = TBQueue
    { queue :: TVar (Seq a)
    , size :: TVar Int
    , maxSize :: Int
    }

  -- Work-stealing deque
  data WSDeque a = WSDeque
    { top :: TVar [a]
    , bottom :: TVar [a]
    }
  ```

- **Async Patterns**:
  ```haskell
  -- Concurrent map with bounded parallelism
  mapConcurrentlyBounded :: Int -> (a -> IO b) -> [a] -> IO [b]
  mapConcurrentlyBounded n f xs = do
    sem <- newQSem n
    asyncs <- forM xs $ \x ->
      async $ bracket_ (waitQSem sem) (signalQSem sem) (f x)
    mapM wait asyncs
  ```

#### Optimization Techniques
- **Fusion & Deforestation**:
  - List fusion with build/foldr
  - Stream fusion in vector
  - Shortcut fusion rules
  - Custom rewrite rules

- **Specialization**:
  ```haskell
  {-# SPECIALIZE sumPoly :: [Int] -> Int #-}
  {-# SPECIALIZE sumPoly :: [Double] -> Double #-}
  sumPoly :: Num a => [a] -> a
  sumPoly = foldl' (+) 0
  ```

- **Inlining Control**:
  ```haskell
  {-# INLINE critical #-}     -- Always inline
  {-# INLINABLE flexible #-}  -- Inline when beneficial
  {-# NOINLINE stable #-}     -- Never inline
  ```

### Common Libraries & Frameworks

#### Web Development Ecosystem

##### Servant - Type-Safe REST APIs
```haskell
type UserAPI = "users" :> Get '[JSON] [User]
          :<|> "users" :> Capture "id" UserId :> Get '[JSON] User
          :<|> "users" :> ReqBody '[JSON] NewUser :> Post '[JSON] User

-- Automatic client generation
userClient :: ClientM [User] :<|> (UserId -> ClientM User) :<|> (NewUser -> ClientM User)
userClient = client (Proxy :: Proxy UserAPI)

-- OpenAPI documentation generation
userDocs :: OpenApi
userDocs = toOpenApi (Proxy :: Proxy UserAPI)
```

##### Yesod - Full-Stack Framework
- Type-safe routing with Template Haskell
- Persistent integration for database
- Form handling with applicative forms
- Authentication and authorization
- Widget system for composable UI

##### WAI/Warp Middleware Stack
```haskell
app :: Application
app = requestLogger
    $ gzip def
    $ cors (const $ Just corsPolicy)
    $ rateLimiting
    $ myApp
```

#### Database Access Patterns

##### Persistent/Esqueleto
```haskell
-- Type-safe schema definition
share [mkPersist sqlSettings] [persistLowerCase|
User
    name Text
    email Text
    UniqueEmail email
    deriving Show
|]

-- Type-safe queries with Esqueleto
getUserPosts :: UserId -> SqlPersistT IO [(Entity User, Entity Post)]
getUserPosts uid =
  select $ from $ \(user `InnerJoin` post) -> do
    on (user ^. UserId ==. post ^. PostUserId)
    where_ (user ^. UserId ==. val uid)
    orderBy [desc (post ^. PostCreated)]
    return (user, post)
```

##### Hasql - PostgreSQL with Prepared Statements
```haskell
userByEmail :: Statement Text (Maybe User)
userByEmail = Statement sql encoder decoder True
  where
    sql = "SELECT * FROM users WHERE email = $1"
    encoder = Encoders.param (Encoders.nonNullable Encoders.text)
    decoder = Decoders.rowMaybe userDecoder
```

##### Opaleye - Composable SQL Generation
- Type-safe query composition
- Compile-time query validation
- Product-profunctor approach

#### Parsing Libraries Deep Dive

##### Megaparsec - Modern Parsing
```haskell
-- Custom error messages
data CustomError = InvalidFormat String
  deriving (Eq, Show, Ord)

type Parser = Parsec CustomError Text

-- Parser with good error messages
jsonValue :: Parser Value
jsonValue = label "JSON value" $
  choice [ Object <$> object
         , Array <$> array
         , String <$> string
         , Number <$> number
         , Bool <$> bool
         , Null <$ symbol "null"
         ]
```

##### Attoparsec - High-Performance Parsing
- Optimized for speed
- Incremental parsing
- Binary and text parsing

##### Parser Combinators vs Parser Generators
- Alex/Happy for complex grammars
- Parser combinators for most use cases
- BNFC for complete language processors

#### Serialization Strategies

##### Aeson - JSON Processing
```haskell
-- Deriving with options
data Config = Config
  { configPort :: Int
  , configHost :: Text
  } deriving (Generic)

instance ToJSON Config where
  toJSON = genericToJSON $ defaultOptions
    { fieldLabelModifier = drop 6 . camelTo2 '_' }

-- Manual instances for performance
instance FromJSON User where
  parseJSON = withObject "User" $ \o -> do
    userId <- o .: "id"
    userName <- o .: "name"
    userEmail <- o .:? "email"
    pure User{..}
```

##### Binary Serialization
- **binary**: Simple, lazy serialization
- **cereal**: Strict alternative to binary
- **store**: Fast, versioned serialization
- **flat**: Bit-level serialization
- **cbor**: IETF standard, schema evolution

#### Networking & Distributed Systems

##### HTTP Clients
```haskell
-- http-client with connection pooling
manager <- newManager defaultManagerSettings
  { managerConnCount = 100
  , managerResponseTimeout = responseTimeoutMicro 30000000
  }

-- req for type-safe requests
response <- runReq defaultHttpConfig $ do
  req GET (https "api.example.com" /: "users")
    NoReqBody jsonResponse
    (header "Authorization" token)
```

##### WebSockets
```haskell
-- Server with wai-websockets
wsApp :: ServerApp
wsApp pending = do
  conn <- acceptRequest pending
  withPingThread conn 30 (return ()) $ do
    msg <- receiveData conn
    sendTextData conn ("Echo: " <> msg)
```

#### Cryptography & Security

##### Cryptonite/Crypton
```haskell
-- Hashing
import Crypto.Hash
hash :: ByteString -> Digest SHA256
hash = hash

-- Symmetric encryption
import Crypto.Cipher.AES
encrypt :: ByteString -> ByteString -> ByteString -> ByteString
encrypt key iv = ecbEncrypt (initAES key)

-- Digital signatures
import Crypto.PubKey.Ed25519
sign :: SecretKey -> ByteString -> Signature
verify :: PublicKey -> ByteString -> Signature -> Bool
```

##### Blockchain Integration
- **web3**: Ethereum JSON-RPC client
- **hs-abci**: Tendermint ABCI server
- Custom blockchain implementations (like Chainweb)

### Architecture Patterns

#### Domain-Driven Design in Haskell
```haskell
-- Make illegal states unrepresentable
data OrderStatus
  = Draft (NonEmpty LineItem)
  | Submitted SubmittedOrder
  | Shipped ShippedOrder
  | Delivered DeliveredOrder
  | Cancelled CancelledOrder

-- Smart constructors with validation
newtype Email = Email Text
mkEmail :: Text -> Either ValidationError Email
mkEmail txt
  | isValidEmail txt = Right (Email txt)
  | otherwise = Left (InvalidEmail txt)

-- Type-safe state transitions
submitOrder :: Order 'Draft -> IO (Either OrderError (Order 'Submitted))
shipOrder :: Order 'Submitted -> ShippingInfo -> IO (Order 'Shipped)
```

#### Service Architecture Patterns

##### Three-Layer Cake Pattern
```haskell
-- Layer 1: Core business logic (pure)
calculateDiscount :: Customer -> Order -> Discount

-- Layer 2: Service layer (ReaderT)
type AppM = ReaderT AppEnv IO

getCustomerOrders :: CustomerId -> AppM [Order]
getCustomerOrders customerId = do
  db <- asks appDatabase
  liftIO $ queryOrders db customerId

-- Layer 3: HTTP/API layer
server :: ServerT API AppM
server = getCustomer :<|> createOrder :<|> listOrders
```

##### Hexagonal Architecture
```haskell
-- Core domain (pure)
module Domain.Order where
data Order = Order { ... }

-- Ports (interfaces)
class Monad m => OrderRepository m where
  saveOrder :: Order -> m OrderId
  findOrder :: OrderId -> m (Maybe Order)

-- Adapters (implementations)
instance OrderRepository (ReaderT PgConnection IO) where
  saveOrder = pgSaveOrder
  findOrder = pgFindOrder
```

#### Error Handling Strategies

##### Typed Errors with Validation
```haskell
-- Domain errors
data DomainError
  = ValidationError ValidationError
  | BusinessRuleViolation Text
  | NotFound ResourceType ResourceId
  deriving (Show, Eq)

-- Validation with Applicative
data UserForm = UserForm
  { formName :: Text
  , formEmail :: Text
  , formAge :: Int
  }

validateUser :: UserForm -> Validation [ValidationError] User
validateUser form = User
  <$> validateName (formName form)
  <*> validateEmail (formEmail form)
  <*> validateAge (formAge form)
```

##### Exception Handling Best Practices
```haskell
-- Custom exceptions
data AppException
  = DatabaseException Text
  | NetworkException HttpException
  | ParseException String
  deriving (Show, Typeable)

instance Exception AppException

-- Safe resource management
withResource :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
withResource acquire release use = bracket acquire release use

-- Async exception safety
uninterruptibleMask_ $ do
  criticalOperation
  atomicWriteIORef state newState
```

#### Configuration Management

##### Type-Safe Configuration
```haskell
-- Configuration types
data AppConfig = AppConfig
  { configDatabase :: DatabaseConfig
  , configServer :: ServerConfig
  , configLogging :: LogConfig
  } deriving (Generic)

-- Loading with validation
loadConfig :: IO (Either ConfigError AppConfig)
loadConfig = do
  env <- lookupEnv "APP_ENV"
  let configFile = fromMaybe "config/development.yaml" env
  yaml <- decodeFileEither configFile
  traverse validateConfig yaml

-- Dhall for type-safe config
loadDhallConfig :: IO AppConfig
loadDhallConfig = input auto "./config.dhall"
```

#### Testing Strategies

##### Property-Based Testing Patterns
```haskell
-- Invariant testing
prop_sortIdempotent :: [Int] -> Bool
prop_sortIdempotent xs = sort (sort xs) == sort xs

-- Model-based testing
data Model = Model { modelItems :: Map ItemId Item }

data Command
  = AddItem Item
  | RemoveItem ItemId
  | UpdateItem ItemId Item

runCommand :: Command -> State Model ()
prop_model :: [Command] -> Property
```

##### Integration Testing
```haskell
-- Test fixtures with finally
withTestDatabase :: (Connection -> IO a) -> IO a
withTestDatabase action = bracket
  (setupTestDb >>= connect)
  (\conn -> cleanupTestDb conn >> close conn)
  action

-- Golden tests
goldenTest :: TestName -> FilePath -> IO ByteString -> TestTree
goldenTest name golden action = goldenVsString name golden (toLazy <$> action)
```

## Problem-Solving Approach

### Initial Analysis Methodology

#### Project Understanding Phase
```bash
# 1. Examine project structure
find . -name "*.cabal" -o -name "stack.yaml" -o -name "package.yaml"
tree -I 'dist-newstyle|.stack-work' -L 2

# 2. Check build configuration
cabal configure --dry-run
grep -E "ghc-options|default-extensions" *.cabal

# 3. Identify key modules
find src -name "*.hs" | head -20
grep -h "^module" src/**/*.hs | sort | uniq

# 4. Review dependencies
cabal list-bins
cabal freeze --dry-run
```

#### Code Convention Analysis
- **Import patterns**: Qualified vs unqualified, explicit vs module imports
- **Extension usage**: Check {-# LANGUAGE #-} pragmas and .cabal file
- **Naming conventions**: CamelCase vs snake_case, module organization
- **Documentation style**: Haddock presence, inline comment patterns
- **Testing approach**: Property tests vs unit tests, test organization

### Debugging Methodology

#### Type Error Resolution
```haskell
-- Common type error patterns and solutions

-- 1. "Could not deduce" - Add type signature or constraint
function :: Num a => a -> a  -- Add constraint
function x = x + 1

-- 2. "Ambiguous type" - Use TypeApplications
result = read @Int "42"  -- Specify type explicitly

-- 3. "Rigid type variable" - Check scoping with ScopedTypeVariables
f :: forall a. a -> a
f x = let g :: a -> a  -- 'a' same as outer
          g = id
      in g x

-- 4. "Infinite type" - Usually indicates missing base case
fix f = f (fix f)  -- Needs type: fix :: (a -> a) -> a
```

#### Runtime Error Diagnosis
```haskell
-- Stack overflow diagnosis
-- Add strictness to accumulator
foldl' (!+) 0 xs  -- Force evaluation

-- Pattern match failure
-- Use total functions
headMay :: [a] -> Maybe a
headMay [] = Nothing
headMay (x:_) = Just x

-- Lazy I/O issues
-- Use strict I/O or streaming
import qualified Data.ByteString as BS
content <- BS.readFile "large.txt"  -- Strict read
```

#### Performance Investigation Process
1. **Profile First**:
   ```bash
   cabal build --enable-profiling
   cabal run myapp -- +RTS -p -hc -RTS
   hp2ps -e8in -c myapp.hp
   ```

2. **Identify Hotspots**:
   - Look for functions with high %time or %alloc
   - Check unexpected allocations
   - Identify tight loops

3. **Memory Leak Detection**:
   ```bash
   # Heap profile by type
   ./myapp +RTS -hy -RTS

   # Retainer profile
   ./myapp +RTS -hr -RTS

   # Biographical profile
   ./myapp +RTS -hb -RTS
   ```

4. **Space Leak Patterns**:
   ```haskell
   -- Lazy accumulator (BAD)
   sum [] acc = acc
   sum (x:xs) acc = sum xs (acc + x)

   -- Strict accumulator (GOOD)
   sum [] !acc = acc
   sum (x:xs) !acc = sum xs (acc + x)
   ```

#### Concurrency Debugging
```haskell
-- Deadlock detection
-- Use STM with timeouts
atomicallyWithTimeout :: Int -> STM a -> IO (Maybe a)
atomicallyWithTimeout microseconds stm =
  race (threadDelay microseconds) (atomically stm) >>= \case
    Left _ -> return Nothing
    Right a -> return (Just a)

-- Race condition prevention
-- Use STM for shared state
type Counter = TVar Int

incrementCounter :: Counter -> STM ()
incrementCounter counter = modifyTVar' counter (+1)

-- Thread debugging
-- Use labeled threads
myThread <- forkIO $ do
  myThreadId >>= \tid -> labelThread tid "worker-thread"
  workerLoop
```

### Code Quality Standards

#### Type-Driven Development
```haskell
-- 1. Start with types
data PaymentMethod
  = CreditCard CardNumber CVV Expiry
  | BankTransfer AccountNumber RoutingNumber
  | PayPal Email

-- 2. Make illegal states unrepresentable
data Connection
  = Disconnected
  | Connecting ConnectionAttempt
  | Connected Socket
  | Failed Error

-- 3. Use phantom types for safety
newtype Id (a :: Type) = Id UUID
type UserId = Id User
type OrderId = Id Order

-- 4. Leverage type families
type family Result op where
  Result 'Read = Maybe Document
  Result 'Write = Either WriteError ()
  Result 'Delete = Bool
```

#### Documentation Standards
```haskell
-- | Process payment transaction.
--
-- Handles complete payment flow including:
--
-- * Validation payment details
-- * Communication with payment gateway
-- * Recording transaction in database
--
-- ==== Examples
--
-- >>> processPayment (CreditCard "4242424242424242" "123" "12/25") 99.99
-- Right (TransactionId "tx_abc123")
--
-- @since 1.0.0
processPayment
  :: PaymentMethod
  -- ^ Payment method to use
  -> Amount
  -- ^ Amount to charge
  -> IO (Either PaymentError TransactionId)
  -- ^ Returns either error or successful transaction ID
```

#### Testing Philosophy
```haskell
-- Property: Serialization roundtrip
prop_jsonRoundtrip :: User -> Property
prop_jsonRoundtrip user =
  decode (encode user) === Just user

-- Property: Invariant preservation
prop_balanceNonNegative :: Account -> [Transaction] -> Property
prop_balanceNonNegative account txns =
  let finalBalance = applyTransactions account txns
  in finalBalance >= 0 ==> classify (finalBalance == 0) "zero balance" True

-- Unit test for edge case
test_emptyListHandling :: TestTree
test_emptyListHandling = testCase "handles empty list" $ do
  result <- processItems []
  result @?= EmptyResult
```

## Common Pitfalls & Solutions

### Memory Leak Patterns & Fixes

#### Pattern 1: Lazy Accumulator
```haskell
-- LEAK: Builds thunks
badSum :: [Int] -> Int
badSum = foldl (+) 0

-- FIX: Force evaluation
goodSum :: [Int] -> Int
goodSum = foldl' (+) 0

-- LEAK: Lazy record fields
data Stats = Stats
  { count :: Int
  , total :: Double
  }

-- FIX: Strict fields
data Stats = Stats
  { count :: !Int
  , total :: !Double
  }
```

#### Pattern 2: Infinite Data Retention
```haskell
-- LEAK: Retains entire list
average xs = sum xs / fromIntegral (length xs)

-- FIX: Single pass with strict accumulator
average xs = uncurry (/) $ foldl' (\(!s,!n) x -> (s+x,n+1)) (0,0) xs
```

### Type System Gotchas

#### Overlapping Instances
```haskell
-- PROBLEM: Overlapping instances
instance Show a => Show [a]
instance Show String  -- Overlaps!

-- SOLUTION: Use newtype or OVERLAPPING pragma
newtype MyString = MyString String
instance Show MyString
```

#### Type Family Injectivity
```haskell
-- PROBLEM: Non-injective type family
type family F a
type instance F Int = Bool
type instance F Char = Bool  -- Same result!

-- SOLUTION: Use injective type family
type family G a = r | r -> a
```

### Performance Pitfalls

#### List vs Vector
```haskell
-- SLOW: List operations
sumOfSquares :: [Int] -> Int
sumOfSquares = sum . map (^2)

-- FAST: Vector operations
import qualified Data.Vector.Unboxed as VU
sumOfSquares :: VU.Vector Int -> Int
sumOfSquares = VU.sum . VU.map (^2)
```

#### String Types
```haskell
-- SLOW: String concatenation
concat :: [String] -> String
concat = foldr (++) ""

-- FAST: Text builder
import qualified Data.Text.Lazy.Builder as TB
concat :: [Text] -> Text
concat = TL.toStrict . TB.toLazyText . mconcat . map TB.fromText
```

## Key Principles

1. **Type Safety First**: Leverage types eliminating entire classes bugs
2. **Pure Core, Imperative Shell**: Keep business logic pure, push effects to boundaries
3. **Parse, Don't Validate**: Transform data into correct-by-construction types early
4. **Make Invalid States Unrepresentable**: Use ADTs model domain precisely
5. **Composition Over Abstraction**: Many small functions > few large abstractions
6. **Explicit Over Magical**: Clear data flow over implicit behavior
7. **Test Properties, Not Examples**: Focus on invariants and laws
8. **Profile, Don't Guess**: Always measure before optimizing
9. **Document Intent**: Types show "what", docs explain "why"
10. **Fail Fast, Recover Gracefully**: Detect errors early, handle at appropriate levels

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.