Haskell Workshop
by Christopher Olah on Aug.06, 2011, under Uncategorized
Haskell is an awesome purely functional language that I’ve been becoming more and more obsessed with in recent months. I consider it to be the most elegant language I’ve ever worked in and want to introduce more people to it!
So, on Monday, August the 8th, 7pm/19:00 I’ll be teaching an introduction to Haskell workshop! Come and learn about laziness, type classes and (the awesome power of) monads!
Please note: This is not an introduction to programming class. You will not be able to follow along if you don’t have experience programming. I am planning to do a day long weekend Introduction to
Programming/Python workshop sometime in the near future that would be much more appropriate for you.
(Sorry about the late notice. I posted to discuss and then forgot to put up a blog post.)
Update: And it went awesome! There was a much bigger turn out than I expected. Here are some notes:
This is the first file I made as we went along. Unfortunately, we don’t seem to have syntax highlighting…
import Text.Parsec -- we'll use this later
-- Things that would be good to install
-- ghc
-- cabal
-- also: tryhaskell.org
-- operators are what you would expect, except:
-- doesn't equal is /=
-- concatonate is ++
-- Some operators you may not have seen before
-- $, applies right to left (ie, does nothing) but
-- changes order of operation to get rid of brackets
-- ., compose right function with left
-- Operators are infix, other funcs prefix.
-- eg 1/2 but div 1 2
-- switch back and forth: (/) 1 2 and 1 `div` 2
-- Calculate the fibonacci sequence
fib :: Int -> Int
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
--Using a case
fib2 :: Int -> Int
fib2 n = case n of
0 -> 1
1 -> 1
n -> fib2 (n-1) + fib2 (n-2)
-- calculate points in a Julia set (constant k)
-- notice that Float -> (Float -> Int) is the same
-- as Float -> FLoat -> Int by partial application
julia :: Float -> Float -> Int
julia k x = length $ take 100 $ takeWhile (\z -> abs(z)<2)$
iterate (\z -> z^2 + k) x
-- Algebraic data types!
data Person = Eric | Jesus| Brian| Jane | John | Mary | Eve
--To be able to output, we need to make Person an instance of Show
instance Show Person where
show Eric = "Eric"
show Jesus = "Jesus"
show Brian = "Brian"
show Jane = "Jane"
show John = "John"
show Mary = "Mary"
show Eve = "Eve"
-- gives you mother of a Person
mother :: Person -> Maybe Person
mother Eric = Just Mary
mother Jesus = Just Mary
mother Brian = Just Mary
mother John = Just Mary
mother Mary = Just Jane
mother Jane = Just Eve
mother Eve = Nothing
-- Why didn't we have to make a show instance for Maybe Person?
-- It already exists, as a general definition, something like:
--data Maybe a = Nothing | Just a
--instance (Show a) => Show Maybe a where
-- show (Just a) = "Just" ++ show a
-- show Nothing = "Nothing"
-- Recursive Algebraic Data Types are possible.
-- List is something like:
-- data [a] = [] | a : [a]
-- data List a = Empty | Item a (List a)
-- What makes a monad a monad? >>= (bind operator)
-- eg. [1,2,3] >>= (\a -> [a^2])
-- eg. Nothing >>= (\a -> Just $ a^2 )
-- We'd like to implement Cartesian Product
-- eg. [1,2] [3,4] -> [(1,3),(1,4), (2,3), (2,4)]
-- [1,2,3] >>= (\a -> ([4,5,6] >>= (\b -> [(a,b)])))
-- Since that is tedious, haskell has do notation
prod as bs = do
a <- as
b <- bs
return (a,b) -- return just monadifies things
greatgrandmother a = case (mother a) of
Nothing -> Nothing
Just b -> case (mother b) of
Nothing -> Nothing
Just c -> mother c
greatgrandmother2 a = do
b <- mother a
c <- mother b
d <- mother c
return d
-- see hellowrold.hs
-- Parsec, the best parsing library ever!
element = string "H" <|> string "He"
elmentPair = do
elem <- element
num <- digit
return (elem, num)
-- do {a <- b; return a} = b >>= (\a -> return a)
And the second file:
-- Haskell handels IO by having main be an object that represents IO -- It's a monad to make it easy to chain IO actions together :) main = do putStrLn "Hello World!" putStrLn "bah sheep!!" putStrLn "spit! Camel case! Grunt" a <- getLine putStrLn a
Some great resources are Learn You a Haskell For Great Good, Real World Haskell, and the Haskell Wikibook. A number of my examples were inspired, by things from these.
We also talked about the library Parsec a little bit, and looked at some of ucalc's source code for examples.
August 18th, 2011 on 9:52 pm
[...] Teach my Haskell workshop [...]