Haskell For Lisp Programmers
Haskell For Lisp Programmers
Erik Charlebois
Haskell Lisp
Syntax No Syntax
Statically Typed Dynamically Typed
Pure Functions Impure Functions
Lazy Evaluation Eager Evaluation
Compile and Run Image-Based
Syntax
Function Definition
cons x y = (:) x y
cons = (:)
:type cons
cons :: forall a. a -> [a] -> [a]
Function Application
cons 1 (cons 2 [])
cons 1 $ cons 2 []
> :type ($)
($) :: forall a b. (a -> b) -> a -> b
Syntax
Infix Functions
> :info (:)
data [] a = [] | a : [a]
infixr 5 :
infixr 6 ‘cons‘
1 ‘cons‘ 2 : [] -- error, ((:) (cons 1 2) [])
infixr 4 ‘cons‘
cons = (:)
1 ‘cons‘ 2 : [] -- works, (cons 1 ((:) 2 []))
Syntax
add x y = a + b
where a = x
b = y
foo x y | x == 0 = bar y
foo x y = baz x yeleganKin
Static Types
Types and Kinds
> :kind Char
Char :: *
> :kind []
[] :: * -> *
> :kind [] Char
[] Char :: *
> :type "foo"
"foo" :: [Char]
Pattern Matching
map fn [] = []
map fn (x:xs) = fn x : map fn xs
Type Classes
class Monoid a where
mempty :: a
mappend :: a -> a -> a
class Foldable t where
fold :: Monoid m => t m -> m
instance Foldable Tree where
fold (Leaf a) = a
fold (Node a b) = fold a ‘mappend‘ fold b
> fold (Node (Node (Leaf [3]) (Leaf [4])) (Leaf [5]))
[3,4,5] :: [Integer]
Laziness
Infinite lists
> let x = 1 : 2 : 3 : x
> x
[1,2,3,1,2,3,1,2,3,1,2,3,1,...]
> take 10 x
[1,2,3,1,2,3,1,2,3,1]
Purity
getState :: State s s
getState = State (\s -> (s,s))
morefun_withsugar = do
incrementBy1
s <- getState
incrementBy1
putState s
> runfun
11 :: Integer
The Haskell Platform
Haskell Platform
library
extensions: TemplateHaskell
build-depends: base, template-haskell, haskell-src-meta
hs-source-dirs: src
exposed-modules: Text.InterpolatedString.QQ
Hackage
I Research
I Formal verification
I Parallelism
I Type theory
I Commercial
I Financial sector (Credit Suisse)
I Security and encryption (Galois)
I Hardware design (Bluespec)
I Procedural city generation (gamr7)
I Multimedia content creation (Anygma)
I Open Source
I Languages (GHC, Pugs)
I Window Manager (xmonad)
I Source Control (darcs)
I Build System, Packaging (cabal)
I Web Applications (happs, hoogle)
What I’m up to...
Personal Preferences
istr :: QuasiQuoter
istr = QuasiQuoter (makeExpr $ parseStr "") undefined
Interpolated Strings