Haskell Tutorials
Home
(current)
Tutorials
Haskell on AWS Lambda
Getting started with Odd Jobs
Opaleye Tutorial
Haskell without the theory
Online Haskell Compiler
Haskell Lists: The Ultimate Guide
Work In Progress
Haskell Lists: Two big Caveats
Constructing lists in Haskell
Pattern-matching of Haskell lists
Subtle difference between : and [] when pattern-matching
Iterating over a Haskell list
Appending / Joining / Growing Haskell lists
(++) :: list1 -> list2 -> joined-list
concat :: list-of-lists -> joined-list
(:) :: element -> list -> consed-list
intercalate :: delimeter -> list -> joined-list
Determining the length of a Haskell list
Finding a single element in a Haskell list
find :: condition -> list -> Maybe element
elem :: element -> list -> Bool
notElem :: element -> list -> Bool
any :: condition -> list -> Bool
Filtering / Rejecting / Selecting multiple elements from a Haskell list
filter :: condition -> list -> filtered-list
take :: number-of-elements-to-take -> list -> shorter-list
drop :: number-of-elements-to-drop -> list -> shorter-list
takeWhile :: condition -> list -> shorter-list
dropWhile :: condition -> list -> shorter-list
dropWhileEnd :: condition -> list -> shorter-list
Opaleye Tutorial
Instant Gratification
Learning Goal
Setting up the Postgres schema
The Complete Code
Haskell code preliminaries
Connecting to the Postgres DB
Teaching Opaleye your table structure
Selecting all rows
Note about type signatures
Searching by email (and introducing the Opaleye DSL)
What is the .== operator
What is the toFields function
Inserting a row
Another note about the toFields function
Updating a row
Implementation Guide
Learning Goal
Opalaye's Query DSL - Pros & Cons
Pick your data-structures
Auto-generate the boilerplate
Formalize all of this in a custom monad
Managing your database connections
Dealing with database transactions
Logging related to DB/Opaleye
Basic DB Mapping
Warning
Overview
Strange polymorphic records
Different types for read & write
Different types for read & write - again
Wrapping-up
Template Haskell expansion
Using Opaleye with simple Haskell records
Using Opaleye with polymorphic Haskell records
Supercharged polymorphic records with type-families
Simple newtypes over Int (or Int64 ) for your primary keys
Phantom types for reducing newtype boilerplate for your primary keys
Advanced DB Mapping
Warning
Overview
SQL for table creation
Code that we'll run through
Core mechanism for mapping custom Haskell types to PG types
FromField
QueryRunnerColumnDefault
Default
Newtypes for primary keys
Mapping ENUMs to Haskell ADTs
Handing Postgres Arrays
Handling JSONB
Making columns read-only
Opaleye Query Tutorial
Warning
Inserting Rows
Warning
SQL for table creation
Inserting rows
Getting the ID of a newly inserted row
Three functions missing from the Opaleye API
Dealing with errors
Using a different record-type for INSERTs
Updating Rows
Warning
SQL for table creation
Updating rows
Getting the updated rows back from the DB
Commentary on Opaleye's update APIs
Multi-table updates (updates with JOINs)
Custom monad with one DB connection per thread
Custom monad with one DB connection per logical DB operation
Custom monad using opaleye-trans
Introduction
Opaleye Tutorial
Chapters
Instant Gratification
Implementation Guide
Basic DB Mapping
Advanced DB Mapping
Opaleye Query Tutorial
Inserting Rows
Updating Rows
Custom monad with one DB connection per thread
Custom monad with one DB connection per logical DB operation
Custom monad using opaleye-trans
Keep me informed →
→
About two emails a month, and no irrelevant junk!