background preloader

Monads

Facebook Twitter

MonadGuide. Monads for the Working Haskell Programmer. Theodore Norvell Memorial University of Newfoundland New: Updated to Haskell '98.

Monads for the Working Haskell Programmer

This short tutorial introduces monads to Haskell programmers. It applies to Haskell '98. Gofer programmers (are there any left?) Can read it too; there is a section at the end detailing the differences between Haskell and Gofer around monads and another about the differences between Haskell 1.3, Haskell 1.4, and Haskell 98. The reader is assumed to have a familiarity with the basics of Haskell programming such as data declarations, function definitions, and lambda expressions. Haskell/Monad transformers. We have seen how monads can help handling IO actions, Maybe, lists, and state.

Haskell/Monad transformers

With monads providing a common way to use such useful general-purpose tools, a natural thing we might want to do is using the capabilities of several monads at once. For instance, a function could use both I/O and Maybe exception handling. While a type like IO (Maybe a) would work just fine, it would force us to do pattern matching within IO do-blocks to extract values, something that the Maybe monad was meant to spare us from.

Tutorials. 1 Introductions to Haskell These are the recommended places to start learning, short of buying a textbook. 1.1 Best places to start.

Tutorials

All About Monads. All About Monads is a tutorial on monads and monad transformers and a walk-through of common monad instances.

All About Monads

You can download a PDF version here. And here is a version of the article which includes source code. Attempts are being made at porting the tutorial to this wiki; what you're seeing below is a preview of the result of that effort. If you wish to help out you should fork this GitHub repo rather than edit this page, for now. How to play with Control.Monad.Writer in haskell? Haskell Monad Tutorial. All About Monads.

Grok Haskell Monad Transformers. Another literate Haskell post: I've tried a few times to read various documents on the web aboutMonad Transformers in Haskell.

Grok Haskell Monad Transformers

I think that in almost every case theauthors are trying to show how clever they are rather than explainingtheir use. If I had just seen the simplest possible examples of MonadTransformers at work I would have been able to figure out what was goingon and that would have given me enough information to bootstrap myselfinto Monad Transforming enlightenment. So to save other people the trouble I went through I'm providing youwith examples of Monad Transformers at work. I'm not even going toexplain in detail how they work, they're close to self-evident once themain features are pointed out.

> import Control.Monad.State> import Control.Monad.Identity Firstly here are two examples of the use of the State Monad. Haskell/Monad transformers. Reader Monad Confusion. I've been using haskell for about a year now, and thought I was really beginning to get a handle on this monad thing.

Reader Monad Confusion

Other than a strange name, and confusing C programmers with the keyword return that doesn't return, they looked like they were just a way of connecting things together, kinda like function composition. In fact, I found myself frequently writing code like: > goldbach => let primes = sieve [2..] > where sieve (p:xs) = p : sieve [x | x<-xs, x `mod` p /= 0]> p100 = takeWhile (<100) primes > pairs = [x+y | x<-p100, y<-p100]> evens = [4,6..100] :: [Int]> isPair x = x `elem` pairs> checkEvens = map isPair evens> conjecture = all id checkEvens> in conjecture Here function composition, (not) cleverly disguised as a bunch of lets that accumulate, acts as the bind operator, providing sequencing. The Monadic Way. Note Since the size of the previous file was getting too big for a wiki, the tutorial has been divided into two parts: The Monadic Way Part I and The Monadic Way Part II.

The Monadic Way

See below for some introductory remarks. Contents Meet Bob The Monadic Lover A (supposed-to-be) funny and short introduction to Monads, with code but without any reference to category theory: what monads look like and what they are useful for, from the perspective of a ... lover. It could be an introduction to "The Monadic Way" tutorial.

The Monadic Way/Part I In the first part of the tutorial we will start from a very simple evaluator that will be transformed into a monadic evaluator with an increasing number of features: output, exceptions, and state: a very simple counter for tracking the number of recursions of the evaluation precess. The Monadic Way/Part II In the second part of the tutorial we will see how to take complexity out of our monadic evaluator with the use of monadic transformers, and specifically StateT. Baastad. Haskell/Monoids. In earlier parts of the book, we have made a few passing allusions to monoids and the Monoid type class (most notably when discussing MonadPlus).

Haskell/Monoids

Here we'll give them a more detailed look and show what makes them useful. What is a monoid? [edit] The operation of adding numbers has a handful of properties which are so elementary we don't even think about them when summing numbers up. One of them is associativity: when adding three or more numbers it doesn't matter how we group the terms. GHCi> (5 + 6) + 1021GHCi> 5 + (6 + 10)21 Another one is that it has an identity element, which can be added to any other number without changing its value. Haskell/Understanding monads. Monads are very useful in Haskell, but the concept is often difficult at first.

Haskell/Understanding monads

Since they have so many applications, people often explain them from a particular point of view, and that can confuse your understanding of monads in their full glory. Historically, monads were introduced into Haskell to perform input/output. A predetermined execution order is crucial for things like reading and writing files, and monadic operations follow an inherent sequence. We discussed sequencing and IO back in Simple input and output using the do notation. Well, do is actually just syntactic sugar over monads. Monads are by no means limited to input and output. Definition[edit] Introductions to advanced Haskell topics. Many people bemoan the sharp divide between experts and beginning Haskell programmers.

Introductions to advanced Haskell topics

One thing I've noticed is that "advanced" Haskell topics all have one thing in common: there exists only one good tutorial on that topic and only the experts have found it. This post is a collection of links to what I consider to be the definitive tutorials on these topics. Monads Monads are technically not an advanced Haskell topic, but I include this topic in the list because the vast majority of monad tutorials are terrible and/or misleading. In my opinion, the best monad tutorial (Titled: "You could have invented monads") was written 8 years ago by Dan Piponi and nobody has ever improved on it since. You Could Have Invented Monads! (And Maybe You Already Have.)

If you hadn't guessed, this is about monads as they appear in pure functional programming languages like Haskell. They are closely related to the monads of category theory, but are not exactly the same because Haskell doesn't enforce the identities satisfied by categorical monads. Writing introductions to monads seems to have developed into an industry. The State Monad: A Tutorial for the Confused? - Brandon.Si(mmons)

I’ve written this brief tutorial on haskell’s State monad to help bridge some of the elusive gaps that I encountered in other explanations I’ve read, and to try to cut through all the sticky abstraction. This is written for someone who has a good understanding of the Maybe and List monads, but has gotten stuck trying to understand State. I hope it’s helpful! The Data Declaration: To understand a monad you look at it’s datatype and then at the definition for bind (>>=). Most monad tutorials start by showing you the data declaration of a State s a in passing, as if it needed no explanation: But this does need explanation! 11. State Monad. State Monad. The State Monad by Example This is a short tutorial on the state monad.

Emphasis is placed on intuition. The types have been simplified to protect the innocent. Another longer walkthrough of the state monad can be found in the wiki book section Understanding monads/State. 1.1 Primitives set the result value but leave the state unchanged. A quick tutorial on the state monad. The state monad is a built in monad in Haskell that allows for chaining of a state variable (which may be arbitrarily complex) through a series of function calls, to simulate stateful code. It is defined as: which, honestly, can be pretty bewildering at first. There are a few things going on here for starters. First, if you haven't seen it before, newtype is a lot like data, except for some details that don't matter right now; just think of it as data for the moment. Three Useful Monads. Note: before reading this, you should know what a monad is. Read this post if you don’t! Here’s a function half: And we can apply it a couple of times: half . half $ 8=> 2 Everything works as expected.

Confusion over the State Monad code on "Learn you a Haskell" Monads made difficult. Monads as containers. All About Monads. The Monad.Reader/Issue3/Functional Programming vs Object Oriented Programming. This article arose from a discussion I had with Shae Erisson (shapr) after he witnessed some drivel I left on one of the c2.com wiki pages. It's not really a discussion of the pros and cons of functional or object-oriented programming.