SlideShare a Scribd company logo
1 of 101
Download to read offline
Why Haskell?
   Susan Potter




   March 2012
What is Haskell?




    Figure:   "pure functional, lazy, polymorphic, statically and strongly typed with type inference . . . "
How can I drive this thing?




 Figure: Photo from "If programming languages were cars" blog post
           http://machinegestalt.posterous.com/if-programming-languages-were-cars
Can I drive Haskell without all this?




 Figure: No need to know Category Theory proofs, just some intuitions!
# finger $(whoami)


Login: susan               Name: Susan Potter
Directory: /home/susan     Shell: /bin/zsh
Practicing since 1997-09-29 21:18 (GMT) on tty1 from :0
Too much unread mail on me@susanpotter.net
Now working at Desk.com! Looking for smart developers!;)
Plan:
  github: mbbx6spp
  twitter: @SusanPotter
Are we "doing it wrong"?




         Figure: Maybe! ;)
          http://absolutelymadness.tumblr.com/post/17567574522
Overview: Choosing a language

    Many considerations
    political, human, technical


    Runtime
    performance, reliability, conļ¬gurability


    Knowledge
    culture, mindshare, resources, signal to noise ratio


    Tooling
    development, build/release, conļ¬guration, deployment
Overview: Choosing a language

    Many considerations
    political, human, technical


    Runtime
    performance, reliability, conļ¬gurability


    Knowledge
    culture, mindshare, resources, signal to noise ratio


    Tooling
    development, build/release, conļ¬guration, deployment
Overview: Choosing a language

    Many considerations
    political, human, technical


    Runtime
    performance, reliability, conļ¬gurability


    Knowledge
    culture, mindshare, resources, signal to noise ratio


    Tooling
    development, build/release, conļ¬guration, deployment
Overview: Choosing a language

    Many considerations
    political, human, technical


    Runtime
    performance, reliability, conļ¬gurability


    Knowledge
    culture, mindshare, resources, signal to noise ratio


    Tooling
    development, build/release, conļ¬guration, deployment
Overview: Agenda
    My Claims / Hypotheses

    Laziness, Functional, Type System

    Toolkit & Runtime

    Library Ecosystem

    Pitfalls & Hurdles
My Claims
    Performance is reasonable
    on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks

    http://shootout.alioth.debian.org/u64q/haskell.php



    Productivity with long-term beneļ¬ts
    after initial steep learning curve



    Haskell types offer stronger veriļ¬ability
    strong and meaningful checks applied



    Pure functional code is easier to test
    probably not controversial
My Claims
    Performance is reasonable
    on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks

    http://shootout.alioth.debian.org/u64q/haskell.php



    Productivity with long-term beneļ¬ts
    after initial steep learning curve



    Haskell types offer stronger veriļ¬ability
    strong and meaningful checks applied



    Pure functional code is easier to test
    probably not controversial
My Claims
    Performance is reasonable
    on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks

    http://shootout.alioth.debian.org/u64q/haskell.php



    Productivity with long-term beneļ¬ts
    after initial steep learning curve



    Haskell types offer stronger veriļ¬ability
    strong and meaningful checks applied



    Pure functional code is easier to test
    probably not controversial
My Claims
    Performance is reasonable
    on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks

    http://shootout.alioth.debian.org/u64q/haskell.php



    Productivity with long-term beneļ¬ts
    after initial steep learning curve



    Haskell types offer stronger veriļ¬ability
    strong and meaningful checks applied



    Pure functional code is easier to test
    probably not controversial
Haskell "lazy" by default




       Figure: Photo by Mark Fischer
            http://www.flickr.com/photos/tom_ruaat/4431626234/
Haskell "lazy" by default




       Figure: Photo by Mark Fischer
            http://www.flickr.com/photos/tom_ruaat/4431626234/



           (jarring for mainstream programmers)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value

    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value
       (evaluates inner-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value
       (evaluates inner-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value
       (evaluates inner-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value
       (evaluates inner-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name

    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Example: doubleSum 3 (2 + 3)
       Call by value
       (evaluates inner-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ doubleSum 3 5
     ā†’ 2 * (3 + 5)
     ā†’ 2 * 8
     ā†’ 16

       Call by name
       (evaluates outer-most expressions ļ¬rst)



    doubleSum 3 (2 + 3)
     ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
Laziness in Haskell is . . .

 CallByName

 + SharingOptimization

 + PossibleMinorOverhead
Laziness: Buyer Beware
    filter (Ī» x ā†’ x < 6) [1..]
    (never terminates)



    takeWhile (Ī» x ā†’ x < 6) [1..]
    (does terminate)



    dropWhile (Ī» x ā†’ x >= 6) [1..]
    (does not terminate)



    Need to understand implications
    of laziness on functions



    Laziness with I/O implications
    lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries

    available to help with this: enumerator, pipes, . . .
Laziness: Buyer Beware
    filter (Ī» x ā†’ x < 6) [1..]
    (never terminates)



    takeWhile (Ī» x ā†’ x < 6) [1..]
    (does terminate)



    dropWhile (Ī» x ā†’ x >= 6) [1..]
    (does not terminate)



    Need to understand implications
    of laziness on functions



    Laziness with I/O implications
    lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries

    available to help with this: enumerator, pipes, . . .
Laziness: Buyer Beware
    filter (Ī» x ā†’ x < 6) [1..]
    (never terminates)



    takeWhile (Ī» x ā†’ x < 6) [1..]
    (does terminate)



    dropWhile (Ī» x ā†’ x >= 6) [1..]
    (does not terminate)



    Need to understand implications
    of laziness on functions



    Laziness with I/O implications
    lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries

    available to help with this: enumerator, pipes, . . .
Laziness: Buyer Beware
    filter (Ī» x ā†’ x < 6) [1..]
    (never terminates)



    takeWhile (Ī» x ā†’ x < 6) [1..]
    (does terminate)



    dropWhile (Ī» x ā†’ x >= 6) [1..]
    (does not terminate)



    Need to understand implications
    of laziness on functions



    Laziness with I/O implications
    lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries

    available to help with this: enumerator, pipes, . . .
Laziness: Buyer Beware
    filter (Ī» x ā†’ x < 6) [1..]
    (never terminates)



    takeWhile (Ī» x ā†’ x < 6) [1..]
    (does terminate)



    dropWhile (Ī» x ā†’ x >= 6) [1..]
    (does not terminate)



    Need to understand implications
    of laziness on functions



    Laziness with I/O implications
    lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries

    available to help with this: enumerator, pipes, . . .
Laziness: Also Pretty Suuweeeet!

     Inļ¬nite sequences/lists
     made possible



     Recursive functions
     become practical



     Recursive types
     become simple



     Much more as well ...
Laziness: Also Pretty Suuweeeet!

     Inļ¬nite sequences/lists
     made possible



     Recursive functions
     become practical



     Recursive types
     become simple



     Much more as well ...
Laziness: Also Pretty Suuweeeet!

     Inļ¬nite sequences/lists
     made possible



     Recursive functions
     become practical



     Recursive types
     become simple



     Much more as well ...
Laziness: Also Pretty Suuweeeet!

     Inļ¬nite sequences/lists
     made possible



     Recursive functions
     become practical



     Recursive types
     become simple



     Much more as well ...
Purity + Laziness=> Reasoning


     Equality (referential transparency)
     Can replace occurrences of LHS with RHS



     Higher Order Functions
     encourage exploitation of higher-level patterns



     Function Composition
     leads to greater reuse
Purity + Laziness=> Reasoning


     Equality (referential transparency)
     Can replace occurrences of LHS with RHS



     Higher Order Functions
     encourage exploitation of higher-level patterns



     Function Composition
     leads to greater reuse
Purity + Laziness=> Reasoning


     Equality (referential transparency)
     Can replace occurrences of LHS with RHS



     Higher Order Functions
     encourage exploitation of higher-level patterns



     Function Composition
     leads to greater reuse
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
mysum :: Num a => [a] -> a
mysum xs = foldr (+) 0 xs

myproduct :: Num a => [a] -> a
myproduct xs = foldr (*) 1 xs

myany :: (a -> Bool) -> [a] -> Bool
myany pred xs = foldr ( x b -> b || pred x) False xs

myall :: (a -> Bool) -> [a] -> Bool
myall pred xs = foldr ( x b -> b && pred x) True xs
class Monoid m where
  mappend :: m -> m -> m
  mempty :: m

instance Num a => Monoid a where
  mappend :: m -> m -> m
  mappend x y = (+) x y
  mempty :: m
  mempty = 0

instance Monoid Bool where
  mappend :: m -> m -> m
  mappend True _ = True
  mappend _ True = True
  mappend _ _ = False
  mempty :: m
class Monoid m where
  mappend :: m -> m -> m
  mempty :: m

instance Num a => Monoid a where
  mappend :: m -> m -> m
  mappend x y = (+) x y
  mempty :: m
  mempty = 0

instance Monoid Bool where
  mappend :: m -> m -> m
  mappend True _ = True
  mappend _ True = True
  mappend _ _ = False
  mempty :: m
class Monoid m where
  mappend :: m -> m -> m
  mempty :: m

instance Num a => Monoid a where
  mappend :: m -> m -> m
  mappend x y = (+) x y
  mempty :: m
  mempty = 0

instance Monoid Bool where
  mappend :: m -> m -> m
  mappend True _ = True
  mappend _ True = True
  mappend _ _ = False
  mempty :: m
Haskell type signatures can . . .
     express side effects
     e.g. String -> IO Int

     declare computational strategies
     e.g. Num a => [a] -> Sum a

     impose constraints
     e.g. Num a => a -> a

     question value availability
     e.g. String -> Maybe Int

     verify client-server protocol dialogs?
     an exercise for reader ;)
Haskell type signatures can . . .
     express side effects
     e.g. String -> IO Int

     declare computational strategies
     e.g. Num a => [a] -> Sum a

     impose constraints
     e.g. Num a => a -> a

     question value availability
     e.g. String -> Maybe Int

     verify client-server protocol dialogs?
     an exercise for reader ;)
Haskell type signatures can . . .
     express side effects
     e.g. String -> IO Int

     declare computational strategies
     e.g. Num a => [a] -> Sum a

     impose constraints
     e.g. Num a => a -> a

     question value availability
     e.g. String -> Maybe Int

     verify client-server protocol dialogs?
     an exercise for reader ;)
Haskell type signatures can . . .
     express side effects
     e.g. String -> IO Int

     declare computational strategies
     e.g. Num a => [a] -> Sum a

     impose constraints
     e.g. Num a => a -> a

     question value availability
     e.g. String -> Maybe Int

     verify client-server protocol dialogs?
     an exercise for reader ;)
Haskell type signatures can . . .
     express side effects
     e.g. String -> IO Int

     declare computational strategies
     e.g. Num a => [a] -> Sum a

     impose constraints
     e.g. Num a => a -> a

     question value availability
     e.g. String -> Maybe Int

     verify client-server protocol dialogs?
     an exercise for reader ;)
Interfaces in OO . . .




  Figure: Class deļ¬nitions are married to the interfaces they implement.
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
Interfaces in Haskell: Typeclasses. . .

     Decouple type deļ¬nition from interface
     Allow upstream implementations
     Extend thirdparty libraries easily
     Redeļ¬ne implementations upstream
     No meaningless "any type" functions

     Very ļ¬‚exible
class (Eq a) => Ord a where
  compare                 :: a -> a -> Ordering
  compare x y | x == y    = EQ
              | x <= y    = LT
              | otherwise = GT
  (<), (>), (>=), (<=)    :: a -> a -> Bool
  ...
  max, min                :: a -> a -> a
  ...
Typically this just works . . .
   data SimpleShape = Square { size :: Double }
                    | Circle { radius :: Double }
                    deriving (Eq, Ord, Show)
     We explicitly use the default definitions


. . . and when it doesnā€™t . . .
   instance Ord SimpleShape where
     ...
Are you awake?




 Figure: http://absolutelymadness.tumblr.com/post/18126913457
Haskell Tooling: Libraries


         Quite a few
         Practical libraries
         Often freely available
         Permissive OSS licenses
Haskell Tooling: Libraries


         Quite a few
         Practical libraries
         Often freely available
         Permissive OSS licenses
Haskell Tooling: Libraries


         Quite a few
         Practical libraries
         Often freely available
         Permissive OSS licenses
Haskell Tooling: Libraries


         Quite a few
         Practical libraries
         Often freely available
         Permissive OSS licenses
Haskell Tooling: Runtime


         Reasonably performant
         between JVM 7 and C# Mono performance



         GC settings easily customized
         Numerous other runtime options
Haskell Tooling: Runtime


         Reasonably performant
         between JVM 7 and C# Mono performance



         GC settings easily customized
         Numerous other runtime options
Haskell Tooling: Runtime


         Reasonably performant
         between JVM 7 and C# Mono performance



         GC settings easily customized
         Numerous other runtime options
Haskell Tooling: Tools

         Testing tools
         QuickCheck, HUnit



         Documentation tools
         Haddock, Hoogle (lookup documentation)



         Build tools
         Cabal, cabal-dev, cabal-nirvana, see "next slide"
Haskell Tooling: Tools

         Testing tools
         QuickCheck, HUnit



         Documentation tools
         Haddock, Hoogle (lookup documentation)



         Build tools
         Cabal, cabal-dev, cabal-nirvana, see "next slide"
Haskell Tooling: Tools

         Testing tools
         QuickCheck, HUnit



         Documentation tools
         Haddock, Hoogle (lookup documentation)



         Build tools
         Cabal, cabal-dev, cabal-nirvana, see "next slide"
Haskell Tooling: Dependency
Management
        Hackage
        database of freely available Haskell libraries



        Cabal
        great to get started, BUT . . .



        cabal-dev & similar
        provides sandboxing, list RVM with gemsets; more important for statically typed environments



        cabal-nirvana
        think compatible distribution snapshot of Hackage DB
Haskell Tooling: Dependency
Management
        Hackage
        database of freely available Haskell libraries



        Cabal
        great to get started, BUT . . .



        cabal-dev & similar
        provides sandboxing, list RVM with gemsets; more important for statically typed environments



        cabal-nirvana
        think compatible distribution snapshot of Hackage DB
Haskell Tooling: Dependency
Management
        Hackage
        database of freely available Haskell libraries



        Cabal
        great to get started, BUT . . .



        cabal-dev & similar
        provides sandboxing, list RVM with gemsets; more important for statically typed environments



        cabal-nirvana
        think compatible distribution snapshot of Hackage DB
Haskell Tooling: Dependency
Management
        Hackage
        database of freely available Haskell libraries



        Cabal
        great to get started, BUT . . .



        cabal-dev & similar
        provides sandboxing, list RVM with gemsets; more important for statically typed environments



        cabal-nirvana
        think compatible distribution snapshot of Hackage DB
Haskell Tooling: Donā€™ts for Newbies

     Use GHC (not HUGS)
     Hugs written for educational purposes not industrial usage



     Forget what you know (imperative/OO)
     relearn programming in a functional-style



     return is a function name
     it does not mean return in the C/Java/C# way



     class does not mean OO-class
     think decoupled interface with optional default impelementations and a lot more power
Haskell Tooling: Donā€™ts for Newbies

     Use GHC (not HUGS)
     Hugs written for educational purposes not industrial usage



     Forget what you know (imperative/OO)
     relearn programming in a functional-style



     return is a function name
     it does not mean return in the C/Java/C# way



     class does not mean OO-class
     think decoupled interface with optional default impelementations and a lot more power
Haskell Tooling: Donā€™ts for Newbies

     Use GHC (not HUGS)
     Hugs written for educational purposes not industrial usage



     Forget what you know (imperative/OO)
     relearn programming in a functional-style



     return is a function name
     it does not mean return in the C/Java/C# way



     class does not mean OO-class
     think decoupled interface with optional default impelementations and a lot more power
Haskell Tooling: Donā€™ts for Newbies

     Use GHC (not HUGS)
     Hugs written for educational purposes not industrial usage



     Forget what you know (imperative/OO)
     relearn programming in a functional-style



     return is a function name
     it does not mean return in the C/Java/C# way



     class does not mean OO-class
     think decoupled interface with optional default impelementations and a lot more power
Haskell Tooling: Suggestions

         Explicit language extensions
         Intentionally and explicitly enable per module



         Sandbox your builds
         with cabal-dev or similar



         Think in types and shapes
         and use Hoogle to lookup based on types and function "shapes"
Haskell Tooling: Suggestions

         Explicit language extensions
         Intentionally and explicitly enable per module



         Sandbox your builds
         with cabal-dev or similar



         Think in types and shapes
         and use Hoogle to lookup based on types and function "shapes"
Haskell Tooling: Suggestions

         Explicit language extensions
         Intentionally and explicitly enable per module



         Sandbox your builds
         with cabal-dev or similar



         Think in types and shapes
         and use Hoogle to lookup based on types and function "shapes"
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Oh, the possibilities!
     Parallel / Concurrency Options
     threads, dataļ¬‚ow, par, seq



     "Cloud" Haskell
     A kind of Erlang/OTP clone in Haskell



     Data Parallel Haskell
     GHC extensions to support nested data parallelism accounting, "Nepal"



     Haskellā€™s Foreign Function Interface (FFI)
     Interface with native code from Haskell



     GPU Programming in Haskell
     Obsidian, Nikola, GpuGen, numerous papers on this too



     Much more. . .
     Research meeting industrial application
Questions?




        Figure:   http://www.ļ¬‚ickr.com/photos/42682395@N04/




         @SusanPotter
Questions?




        Figure:   http://www.ļ¬‚ickr.com/photos/42682395@N04/




         @SusanPotter
Bonus: References / Resources
    Channel 9 Lectures (Erik Meijer)
    http://channel9.msdn.com/Shows/Going+Deep/

    Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1



    Learn You A Haskell
    http://learnyouahaskell.com



    Haskell Reddit
    http://www.reddit.com/r/haskell/



    Haskell Cafe
    http://www.haskell.org/mailman/listinfo/haskell-cafe



    Real World Haskell
    http://book.realworldhaskell.org/
Bonus: References / Resources
    Channel 9 Lectures (Erik Meijer)
    http://channel9.msdn.com/Shows/Going+Deep/

    Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1



    Learn You A Haskell
    http://learnyouahaskell.com



    Haskell Reddit
    http://www.reddit.com/r/haskell/



    Haskell Cafe
    http://www.haskell.org/mailman/listinfo/haskell-cafe



    Real World Haskell
    http://book.realworldhaskell.org/
Bonus: References / Resources
    Channel 9 Lectures (Erik Meijer)
    http://channel9.msdn.com/Shows/Going+Deep/

    Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1



    Learn You A Haskell
    http://learnyouahaskell.com



    Haskell Reddit
    http://www.reddit.com/r/haskell/



    Haskell Cafe
    http://www.haskell.org/mailman/listinfo/haskell-cafe



    Real World Haskell
    http://book.realworldhaskell.org/
Bonus: References / Resources
    Channel 9 Lectures (Erik Meijer)
    http://channel9.msdn.com/Shows/Going+Deep/

    Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1



    Learn You A Haskell
    http://learnyouahaskell.com



    Haskell Reddit
    http://www.reddit.com/r/haskell/



    Haskell Cafe
    http://www.haskell.org/mailman/listinfo/haskell-cafe



    Real World Haskell
    http://book.realworldhaskell.org/
Bonus: References / Resources
    Channel 9 Lectures (Erik Meijer)
    http://channel9.msdn.com/Shows/Going+Deep/

    Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1



    Learn You A Haskell
    http://learnyouahaskell.com



    Haskell Reddit
    http://www.reddit.com/r/haskell/



    Haskell Cafe
    http://www.haskell.org/mailman/listinfo/haskell-cafe



    Real World Haskell
    http://book.realworldhaskell.org/
Bonus: Brief QuickCheck Example

module Tests where


import Test.QuickCheck (quickCheck)


propReverseReverse :: [Char] -> Bool
propReverseReverse s = (reverse . reverse) s == s


  excuse the weird syntax form, indenting didnā€™t show up ;(
main = do {quickCheck propReverseReverse }

More Related Content

What's hot

Reasoning about laziness
Reasoning about lazinessReasoning about laziness
Reasoning about laziness
Johan Tibell
Ā 
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
Fwdays
Ā 

What's hot (20)

Humble introduction to category theory in haskell
Humble introduction to category theory in haskellHumble introduction to category theory in haskell
Humble introduction to category theory in haskell
Ā 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
Ā 
Functional programming with haskell
Functional programming with haskellFunctional programming with haskell
Functional programming with haskell
Ā 
Haskell
HaskellHaskell
Haskell
Ā 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
Ā 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
Ā 
Swift rocks! #1
Swift rocks! #1Swift rocks! #1
Swift rocks! #1
Ā 
Design Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on ExamplesDesign Patterns - Compiler Case Study - Hands-on Examples
Design Patterns - Compiler Case Study - Hands-on Examples
Ā 
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
Quark: A Purely-Functional Scala DSL for Data Processing & AnalyticsQuark: A Purely-Functional Scala DSL for Data Processing & Analytics
Quark: A Purely-Functional Scala DSL for Data Processing & Analytics
Ā 
Reasoning about laziness
Reasoning about lazinessReasoning about laziness
Reasoning about laziness
Ā 
Swift Rocks #2: Going functional
Swift Rocks #2: Going functionalSwift Rocks #2: Going functional
Swift Rocks #2: Going functional
Ā 
Python Cheat Sheet
Python Cheat SheetPython Cheat Sheet
Python Cheat Sheet
Ā 
Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!Hey! There's OCaml in my Rust!
Hey! There's OCaml in my Rust!
Ā 
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
"ŠŠµŠ¼Š½Š¾Š³Š¾ Š¾ фуŠ½ŠŗцŠøŠ¾Š½Š°Š»ŃŒŠ½Š¾Š¼ ŠæрŠ¾Š³Ń€Š°Š¼Š¼ŠøрŠ¾Š²Š°Š½ŠøŠµ Š² JavaScript" ŠŠ»ŠµŠŗсŠµŠ¹ ŠšŠ¾Š²Š°Š»ŠµŠ½ŠŗŠ¾
Ā 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
Ā 
Coding Guidelines - Crafting Clean Code
Coding Guidelines - Crafting Clean CodeCoding Guidelines - Crafting Clean Code
Coding Guidelines - Crafting Clean Code
Ā 
Demystifying functional programming with Scala
Demystifying functional programming with ScalaDemystifying functional programming with Scala
Demystifying functional programming with Scala
Ā 
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Ā 
What's New In C# 7
What's New In C# 7What's New In C# 7
What's New In C# 7
Ā 
Procedural Programming: Itā€™s Back? It Never Went Away
Procedural Programming: Itā€™s Back? It Never Went AwayProcedural Programming: Itā€™s Back? It Never Went Away
Procedural Programming: Itā€™s Back? It Never Went Away
Ā 

Viewers also liked

Camomile : A Unicode library for OCaml
Camomile : A Unicode library for OCamlCamomile : A Unicode library for OCaml
Camomile : A Unicode library for OCaml
Yamagata Yoriyuki
Ā 
Mirage: ML kernels in the cloud (ML Workshop 2010)
Mirage: ML kernels in the cloud (ML Workshop 2010)Mirage: ML kernels in the cloud (ML Workshop 2010)
Mirage: ML kernels in the cloud (ML Workshop 2010)
Anil Madhavapeddy
Ā 

Viewers also liked (20)

Haskell vs. F# vs. Scala
Haskell vs. F# vs. ScalaHaskell vs. F# vs. Scala
Haskell vs. F# vs. Scala
Ā 
Haskell is Not For Production and Other Tales
Haskell is Not For Production and Other TalesHaskell is Not For Production and Other Tales
Haskell is Not For Production and Other Tales
Ā 
Haskell for the Real World
Haskell for the Real WorldHaskell for the Real World
Haskell for the Real World
Ā 
Haskell - Functional Programming
Haskell - Functional ProgrammingHaskell - Functional Programming
Haskell - Functional Programming
Ā 
Introduction to haskell
Introduction to haskellIntroduction to haskell
Introduction to haskell
Ā 
Camomile : A Unicode library for OCaml
Camomile : A Unicode library for OCamlCamomile : A Unicode library for OCaml
Camomile : A Unicode library for OCaml
Ā 
Distributed Developer Workflows using Git
Distributed Developer Workflows using GitDistributed Developer Workflows using Git
Distributed Developer Workflows using Git
Ā 
Dynamo: Not Just For Datastores
Dynamo: Not Just For DatastoresDynamo: Not Just For Datastores
Dynamo: Not Just For Datastores
Ā 
Writing Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptWriting Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScript
Ā 
Link Walking with Riak
Link Walking with RiakLink Walking with Riak
Link Walking with Riak
Ā 
A taste of Functional Programming
A taste of Functional ProgrammingA taste of Functional Programming
A taste of Functional Programming
Ā 
Using functional programming within an industrial product group: perspectives...
Using functional programming within an industrial product group: perspectives...Using functional programming within an industrial product group: perspectives...
Using functional programming within an industrial product group: perspectives...
Ā 
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
Ā 
Ocaml
OcamlOcaml
Ocaml
Ā 
From Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOSFrom Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOS
Ā 
Ricon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeRicon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak Pipe
Ā 
Introduction to functional programming using Ocaml
Introduction to functional programming using OcamlIntroduction to functional programming using Ocaml
Introduction to functional programming using Ocaml
Ā 
Mirage: ML kernels in the cloud (ML Workshop 2010)
Mirage: ML kernels in the cloud (ML Workshop 2010)Mirage: ML kernels in the cloud (ML Workshop 2010)
Mirage: ML kernels in the cloud (ML Workshop 2010)
Ā 
Lisp Programming Languge
Lisp Programming LangugeLisp Programming Languge
Lisp Programming Languge
Ā 
Designing for Concurrency
Designing for ConcurrencyDesigning for Concurrency
Designing for Concurrency
Ā 

Similar to Why Haskell

Haskell retrospective
Haskell retrospectiveHaskell retrospective
Haskell retrospective
chenge2k
Ā 
Thinking Functionally In Ruby
Thinking Functionally In RubyThinking Functionally In Ruby
Thinking Functionally In Ruby
Ross Lawley
Ā 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
LoĆÆc Descotte
Ā 

Similar to Why Haskell (20)

Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
Ā 
Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?Is Haskell an acceptable Perl?
Is Haskell an acceptable Perl?
Ā 
Haskell retrospective
Haskell retrospectiveHaskell retrospective
Haskell retrospective
Ā 
Template Haskell
Template HaskellTemplate Haskell
Template Haskell
Ā 
JSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why notJSDC 2014 - functional java script, why or why not
JSDC 2014 - functional java script, why or why not
Ā 
42: Rise of the dependent types
42: Rise of the dependent types42: Rise of the dependent types
42: Rise of the dependent types
Ā 
Haskell - Being lazy with class
Haskell - Being lazy with classHaskell - Being lazy with class
Haskell - Being lazy with class
Ā 
Introduction to Functional Languages
Introduction to Functional LanguagesIntroduction to Functional Languages
Introduction to Functional Languages
Ā 
Lambda? You Keep Using that Letter
Lambda? You Keep Using that LetterLambda? You Keep Using that Letter
Lambda? You Keep Using that Letter
Ā 
Python_Cheat_Sheet_Keywords_1664634397.pdf
Python_Cheat_Sheet_Keywords_1664634397.pdfPython_Cheat_Sheet_Keywords_1664634397.pdf
Python_Cheat_Sheet_Keywords_1664634397.pdf
Ā 
Python_Cheat_Sheet_Keywords_1664634397.pdf
Python_Cheat_Sheet_Keywords_1664634397.pdfPython_Cheat_Sheet_Keywords_1664634397.pdf
Python_Cheat_Sheet_Keywords_1664634397.pdf
Ā 
Fp in scala part 2
Fp in scala part 2Fp in scala part 2
Fp in scala part 2
Ā 
Monads and Monoids by Oleksiy Dyagilev
Monads and Monoids by Oleksiy DyagilevMonads and Monoids by Oleksiy Dyagilev
Monads and Monoids by Oleksiy Dyagilev
Ā 
Thinking Functionally In Ruby
Thinking Functionally In RubyThinking Functionally In Ruby
Thinking Functionally In Ruby
Ā 
Class 31: Deanonymizing
Class 31: DeanonymizingClass 31: Deanonymizing
Class 31: Deanonymizing
Ā 
Pharo - I have a dream @ Smalltalks Conference 2009
Pharo -  I have a dream @ Smalltalks Conference 2009Pharo -  I have a dream @ Smalltalks Conference 2009
Pharo - I have a dream @ Smalltalks Conference 2009
Ā 
DA_02_algorithms.pptx
DA_02_algorithms.pptxDA_02_algorithms.pptx
DA_02_algorithms.pptx
Ā 
Why Haskell Matters
Why Haskell MattersWhy Haskell Matters
Why Haskell Matters
Ā 
Lec2_cont.pptx galgotias University questions
Lec2_cont.pptx galgotias University questionsLec2_cont.pptx galgotias University questions
Lec2_cont.pptx galgotias University questions
Ā 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
Ā 

More from Susan Potter

Twitter4R OAuth
Twitter4R OAuthTwitter4R OAuth
Twitter4R OAuth
Susan Potter
Ā 

More from Susan Potter (8)

Thinking in Properties
Thinking in PropertiesThinking in Properties
Thinking in Properties
Ā 
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Ā 
From Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedFrom Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons Learned
Ā 
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Ā 
Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)
Ā 
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
Ā 
Twitter4R OAuth
Twitter4R OAuthTwitter4R OAuth
Twitter4R OAuth
Ā 
Deploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatDeploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweat
Ā 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
Christopher Logan Kennedy
Ā 

Recently uploaded (20)

Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Ā 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Ā 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Ā 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
Ā 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
Ā 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Ā 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Ā 
Elevate Developer Efficiency & build GenAI Application with Amazon Qā€‹
Elevate Developer Efficiency & build GenAI Application with Amazon Qā€‹Elevate Developer Efficiency & build GenAI Application with Amazon Qā€‹
Elevate Developer Efficiency & build GenAI Application with Amazon Qā€‹
Ā 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Ā 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
Ā 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Ā 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Ā 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
Ā 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
Ā 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
Ā 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
Ā 

Why Haskell

  • 1. Why Haskell? Susan Potter March 2012
  • 2. What is Haskell? Figure: "pure functional, lazy, polymorphic, statically and strongly typed with type inference . . . "
  • 3. How can I drive this thing? Figure: Photo from "If programming languages were cars" blog post http://machinegestalt.posterous.com/if-programming-languages-were-cars
  • 4. Can I drive Haskell without all this? Figure: No need to know Category Theory proofs, just some intuitions!
  • 5. # finger $(whoami) Login: susan Name: Susan Potter Directory: /home/susan Shell: /bin/zsh Practicing since 1997-09-29 21:18 (GMT) on tty1 from :0 Too much unread mail on me@susanpotter.net Now working at Desk.com! Looking for smart developers!;) Plan: github: mbbx6spp twitter: @SusanPotter
  • 6. Are we "doing it wrong"? Figure: Maybe! ;) http://absolutelymadness.tumblr.com/post/17567574522
  • 7. Overview: Choosing a language Many considerations political, human, technical Runtime performance, reliability, conļ¬gurability Knowledge culture, mindshare, resources, signal to noise ratio Tooling development, build/release, conļ¬guration, deployment
  • 8. Overview: Choosing a language Many considerations political, human, technical Runtime performance, reliability, conļ¬gurability Knowledge culture, mindshare, resources, signal to noise ratio Tooling development, build/release, conļ¬guration, deployment
  • 9. Overview: Choosing a language Many considerations political, human, technical Runtime performance, reliability, conļ¬gurability Knowledge culture, mindshare, resources, signal to noise ratio Tooling development, build/release, conļ¬guration, deployment
  • 10. Overview: Choosing a language Many considerations political, human, technical Runtime performance, reliability, conļ¬gurability Knowledge culture, mindshare, resources, signal to noise ratio Tooling development, build/release, conļ¬guration, deployment
  • 11. Overview: Agenda My Claims / Hypotheses Laziness, Functional, Type System Toolkit & Runtime Library Ecosystem Pitfalls & Hurdles
  • 12. My Claims Performance is reasonable on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks http://shootout.alioth.debian.org/u64q/haskell.php Productivity with long-term beneļ¬ts after initial steep learning curve Haskell types offer stronger veriļ¬ability strong and meaningful checks applied Pure functional code is easier to test probably not controversial
  • 13. My Claims Performance is reasonable on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks http://shootout.alioth.debian.org/u64q/haskell.php Productivity with long-term beneļ¬ts after initial steep learning curve Haskell types offer stronger veriļ¬ability strong and meaningful checks applied Pure functional code is easier to test probably not controversial
  • 14. My Claims Performance is reasonable on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks http://shootout.alioth.debian.org/u64q/haskell.php Productivity with long-term beneļ¬ts after initial steep learning curve Haskell types offer stronger veriļ¬ability strong and meaningful checks applied Pure functional code is easier to test probably not controversial
  • 15. My Claims Performance is reasonable on par with Java and C# Mono; 2-3x CPU times of C (approx); BUT always doubt benchmarks http://shootout.alioth.debian.org/u64q/haskell.php Productivity with long-term beneļ¬ts after initial steep learning curve Haskell types offer stronger veriļ¬ability strong and meaningful checks applied Pure functional code is easier to test probably not controversial
  • 16. Haskell "lazy" by default Figure: Photo by Mark Fischer http://www.flickr.com/photos/tom_ruaat/4431626234/
  • 17. Haskell "lazy" by default Figure: Photo by Mark Fischer http://www.flickr.com/photos/tom_ruaat/4431626234/ (jarring for mainstream programmers)
  • 18. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 19. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 20. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 21. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 22. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 23. Example: doubleSum 3 (2 + 3) Call by value doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 24. Example: doubleSum 3 (2 + 3) Call by value (evaluates inner-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 25. Example: doubleSum 3 (2 + 3) Call by value (evaluates inner-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 26. Example: doubleSum 3 (2 + 3) Call by value (evaluates inner-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 27. Example: doubleSum 3 (2 + 3) Call by value (evaluates inner-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 28. Example: doubleSum 3 (2 + 3) Call by value (evaluates inner-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ doubleSum 3 5 ā†’ 2 * (3 + 5) ā†’ 2 * 8 ā†’ 16 Call by name (evaluates outer-most expressions ļ¬rst) doubleSum 3 (2 + 3) ā†’ (Ī» x -> 2 * (3 + x)) (2 + 3)
  • 29. Laziness in Haskell is . . . CallByName + SharingOptimization + PossibleMinorOverhead
  • 30. Laziness: Buyer Beware filter (Ī» x ā†’ x < 6) [1..] (never terminates) takeWhile (Ī» x ā†’ x < 6) [1..] (does terminate) dropWhile (Ī» x ā†’ x >= 6) [1..] (does not terminate) Need to understand implications of laziness on functions Laziness with I/O implications lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries available to help with this: enumerator, pipes, . . .
  • 31. Laziness: Buyer Beware filter (Ī» x ā†’ x < 6) [1..] (never terminates) takeWhile (Ī» x ā†’ x < 6) [1..] (does terminate) dropWhile (Ī» x ā†’ x >= 6) [1..] (does not terminate) Need to understand implications of laziness on functions Laziness with I/O implications lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries available to help with this: enumerator, pipes, . . .
  • 32. Laziness: Buyer Beware filter (Ī» x ā†’ x < 6) [1..] (never terminates) takeWhile (Ī» x ā†’ x < 6) [1..] (does terminate) dropWhile (Ī» x ā†’ x >= 6) [1..] (does not terminate) Need to understand implications of laziness on functions Laziness with I/O implications lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries available to help with this: enumerator, pipes, . . .
  • 33. Laziness: Buyer Beware filter (Ī» x ā†’ x < 6) [1..] (never terminates) takeWhile (Ī» x ā†’ x < 6) [1..] (does terminate) dropWhile (Ī» x ā†’ x >= 6) [1..] (does not terminate) Need to understand implications of laziness on functions Laziness with I/O implications lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries available to help with this: enumerator, pipes, . . .
  • 34. Laziness: Buyer Beware filter (Ī» x ā†’ x < 6) [1..] (never terminates) takeWhile (Ī» x ā†’ x < 6) [1..] (does terminate) dropWhile (Ī» x ā†’ x >= 6) [1..] (does not terminate) Need to understand implications of laziness on functions Laziness with I/O implications lazy I/O with handles is problematic, but iteratee idiom solves most of these. There are a number of libraries available to help with this: enumerator, pipes, . . .
  • 35. Laziness: Also Pretty Suuweeeet! Inļ¬nite sequences/lists made possible Recursive functions become practical Recursive types become simple Much more as well ...
  • 36. Laziness: Also Pretty Suuweeeet! Inļ¬nite sequences/lists made possible Recursive functions become practical Recursive types become simple Much more as well ...
  • 37. Laziness: Also Pretty Suuweeeet! Inļ¬nite sequences/lists made possible Recursive functions become practical Recursive types become simple Much more as well ...
  • 38. Laziness: Also Pretty Suuweeeet! Inļ¬nite sequences/lists made possible Recursive functions become practical Recursive types become simple Much more as well ...
  • 39. Purity + Laziness=> Reasoning Equality (referential transparency) Can replace occurrences of LHS with RHS Higher Order Functions encourage exploitation of higher-level patterns Function Composition leads to greater reuse
  • 40. Purity + Laziness=> Reasoning Equality (referential transparency) Can replace occurrences of LHS with RHS Higher Order Functions encourage exploitation of higher-level patterns Function Composition leads to greater reuse
  • 41. Purity + Laziness=> Reasoning Equality (referential transparency) Can replace occurrences of LHS with RHS Higher Order Functions encourage exploitation of higher-level patterns Function Composition leads to greater reuse
  • 42. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 43. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 44. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 45. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 46. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 47. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 48. mysum :: Num a => [a] -> a mysum xs = foldr (+) 0 xs myproduct :: Num a => [a] -> a myproduct xs = foldr (*) 1 xs myany :: (a -> Bool) -> [a] -> Bool myany pred xs = foldr ( x b -> b || pred x) False xs myall :: (a -> Bool) -> [a] -> Bool myall pred xs = foldr ( x b -> b && pred x) True xs
  • 49. class Monoid m where mappend :: m -> m -> m mempty :: m instance Num a => Monoid a where mappend :: m -> m -> m mappend x y = (+) x y mempty :: m mempty = 0 instance Monoid Bool where mappend :: m -> m -> m mappend True _ = True mappend _ True = True mappend _ _ = False mempty :: m
  • 50. class Monoid m where mappend :: m -> m -> m mempty :: m instance Num a => Monoid a where mappend :: m -> m -> m mappend x y = (+) x y mempty :: m mempty = 0 instance Monoid Bool where mappend :: m -> m -> m mappend True _ = True mappend _ True = True mappend _ _ = False mempty :: m
  • 51. class Monoid m where mappend :: m -> m -> m mempty :: m instance Num a => Monoid a where mappend :: m -> m -> m mappend x y = (+) x y mempty :: m mempty = 0 instance Monoid Bool where mappend :: m -> m -> m mappend True _ = True mappend _ True = True mappend _ _ = False mempty :: m
  • 52. Haskell type signatures can . . . express side effects e.g. String -> IO Int declare computational strategies e.g. Num a => [a] -> Sum a impose constraints e.g. Num a => a -> a question value availability e.g. String -> Maybe Int verify client-server protocol dialogs? an exercise for reader ;)
  • 53. Haskell type signatures can . . . express side effects e.g. String -> IO Int declare computational strategies e.g. Num a => [a] -> Sum a impose constraints e.g. Num a => a -> a question value availability e.g. String -> Maybe Int verify client-server protocol dialogs? an exercise for reader ;)
  • 54. Haskell type signatures can . . . express side effects e.g. String -> IO Int declare computational strategies e.g. Num a => [a] -> Sum a impose constraints e.g. Num a => a -> a question value availability e.g. String -> Maybe Int verify client-server protocol dialogs? an exercise for reader ;)
  • 55. Haskell type signatures can . . . express side effects e.g. String -> IO Int declare computational strategies e.g. Num a => [a] -> Sum a impose constraints e.g. Num a => a -> a question value availability e.g. String -> Maybe Int verify client-server protocol dialogs? an exercise for reader ;)
  • 56. Haskell type signatures can . . . express side effects e.g. String -> IO Int declare computational strategies e.g. Num a => [a] -> Sum a impose constraints e.g. Num a => a -> a question value availability e.g. String -> Maybe Int verify client-server protocol dialogs? an exercise for reader ;)
  • 57. Interfaces in OO . . . Figure: Class deļ¬nitions are married to the interfaces they implement.
  • 58. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 59. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 60. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 61. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 62. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 63. Interfaces in Haskell: Typeclasses. . . Decouple type deļ¬nition from interface Allow upstream implementations Extend thirdparty libraries easily Redeļ¬ne implementations upstream No meaningless "any type" functions Very ļ¬‚exible
  • 64. class (Eq a) => Ord a where compare :: a -> a -> Ordering compare x y | x == y = EQ | x <= y = LT | otherwise = GT (<), (>), (>=), (<=) :: a -> a -> Bool ... max, min :: a -> a -> a ...
  • 65. Typically this just works . . . data SimpleShape = Square { size :: Double } | Circle { radius :: Double } deriving (Eq, Ord, Show) We explicitly use the default definitions . . . and when it doesnā€™t . . . instance Ord SimpleShape where ...
  • 66. Are you awake? Figure: http://absolutelymadness.tumblr.com/post/18126913457
  • 67. Haskell Tooling: Libraries Quite a few Practical libraries Often freely available Permissive OSS licenses
  • 68. Haskell Tooling: Libraries Quite a few Practical libraries Often freely available Permissive OSS licenses
  • 69. Haskell Tooling: Libraries Quite a few Practical libraries Often freely available Permissive OSS licenses
  • 70. Haskell Tooling: Libraries Quite a few Practical libraries Often freely available Permissive OSS licenses
  • 71. Haskell Tooling: Runtime Reasonably performant between JVM 7 and C# Mono performance GC settings easily customized Numerous other runtime options
  • 72. Haskell Tooling: Runtime Reasonably performant between JVM 7 and C# Mono performance GC settings easily customized Numerous other runtime options
  • 73. Haskell Tooling: Runtime Reasonably performant between JVM 7 and C# Mono performance GC settings easily customized Numerous other runtime options
  • 74. Haskell Tooling: Tools Testing tools QuickCheck, HUnit Documentation tools Haddock, Hoogle (lookup documentation) Build tools Cabal, cabal-dev, cabal-nirvana, see "next slide"
  • 75. Haskell Tooling: Tools Testing tools QuickCheck, HUnit Documentation tools Haddock, Hoogle (lookup documentation) Build tools Cabal, cabal-dev, cabal-nirvana, see "next slide"
  • 76. Haskell Tooling: Tools Testing tools QuickCheck, HUnit Documentation tools Haddock, Hoogle (lookup documentation) Build tools Cabal, cabal-dev, cabal-nirvana, see "next slide"
  • 77. Haskell Tooling: Dependency Management Hackage database of freely available Haskell libraries Cabal great to get started, BUT . . . cabal-dev & similar provides sandboxing, list RVM with gemsets; more important for statically typed environments cabal-nirvana think compatible distribution snapshot of Hackage DB
  • 78. Haskell Tooling: Dependency Management Hackage database of freely available Haskell libraries Cabal great to get started, BUT . . . cabal-dev & similar provides sandboxing, list RVM with gemsets; more important for statically typed environments cabal-nirvana think compatible distribution snapshot of Hackage DB
  • 79. Haskell Tooling: Dependency Management Hackage database of freely available Haskell libraries Cabal great to get started, BUT . . . cabal-dev & similar provides sandboxing, list RVM with gemsets; more important for statically typed environments cabal-nirvana think compatible distribution snapshot of Hackage DB
  • 80. Haskell Tooling: Dependency Management Hackage database of freely available Haskell libraries Cabal great to get started, BUT . . . cabal-dev & similar provides sandboxing, list RVM with gemsets; more important for statically typed environments cabal-nirvana think compatible distribution snapshot of Hackage DB
  • 81. Haskell Tooling: Donā€™ts for Newbies Use GHC (not HUGS) Hugs written for educational purposes not industrial usage Forget what you know (imperative/OO) relearn programming in a functional-style return is a function name it does not mean return in the C/Java/C# way class does not mean OO-class think decoupled interface with optional default impelementations and a lot more power
  • 82. Haskell Tooling: Donā€™ts for Newbies Use GHC (not HUGS) Hugs written for educational purposes not industrial usage Forget what you know (imperative/OO) relearn programming in a functional-style return is a function name it does not mean return in the C/Java/C# way class does not mean OO-class think decoupled interface with optional default impelementations and a lot more power
  • 83. Haskell Tooling: Donā€™ts for Newbies Use GHC (not HUGS) Hugs written for educational purposes not industrial usage Forget what you know (imperative/OO) relearn programming in a functional-style return is a function name it does not mean return in the C/Java/C# way class does not mean OO-class think decoupled interface with optional default impelementations and a lot more power
  • 84. Haskell Tooling: Donā€™ts for Newbies Use GHC (not HUGS) Hugs written for educational purposes not industrial usage Forget what you know (imperative/OO) relearn programming in a functional-style return is a function name it does not mean return in the C/Java/C# way class does not mean OO-class think decoupled interface with optional default impelementations and a lot more power
  • 85. Haskell Tooling: Suggestions Explicit language extensions Intentionally and explicitly enable per module Sandbox your builds with cabal-dev or similar Think in types and shapes and use Hoogle to lookup based on types and function "shapes"
  • 86. Haskell Tooling: Suggestions Explicit language extensions Intentionally and explicitly enable per module Sandbox your builds with cabal-dev or similar Think in types and shapes and use Hoogle to lookup based on types and function "shapes"
  • 87. Haskell Tooling: Suggestions Explicit language extensions Intentionally and explicitly enable per module Sandbox your builds with cabal-dev or similar Think in types and shapes and use Hoogle to lookup based on types and function "shapes"
  • 88. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 89. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 90. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 91. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 92. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 93. Oh, the possibilities! Parallel / Concurrency Options threads, dataļ¬‚ow, par, seq "Cloud" Haskell A kind of Erlang/OTP clone in Haskell Data Parallel Haskell GHC extensions to support nested data parallelism accounting, "Nepal" Haskellā€™s Foreign Function Interface (FFI) Interface with native code from Haskell GPU Programming in Haskell Obsidian, Nikola, GpuGen, numerous papers on this too Much more. . . Research meeting industrial application
  • 94. Questions? Figure: http://www.ļ¬‚ickr.com/photos/42682395@N04/ @SusanPotter
  • 95. Questions? Figure: http://www.ļ¬‚ickr.com/photos/42682395@N04/ @SusanPotter
  • 96. Bonus: References / Resources Channel 9 Lectures (Erik Meijer) http://channel9.msdn.com/Shows/Going+Deep/ Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1 Learn You A Haskell http://learnyouahaskell.com Haskell Reddit http://www.reddit.com/r/haskell/ Haskell Cafe http://www.haskell.org/mailman/listinfo/haskell-cafe Real World Haskell http://book.realworldhaskell.org/
  • 97. Bonus: References / Resources Channel 9 Lectures (Erik Meijer) http://channel9.msdn.com/Shows/Going+Deep/ Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1 Learn You A Haskell http://learnyouahaskell.com Haskell Reddit http://www.reddit.com/r/haskell/ Haskell Cafe http://www.haskell.org/mailman/listinfo/haskell-cafe Real World Haskell http://book.realworldhaskell.org/
  • 98. Bonus: References / Resources Channel 9 Lectures (Erik Meijer) http://channel9.msdn.com/Shows/Going+Deep/ Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1 Learn You A Haskell http://learnyouahaskell.com Haskell Reddit http://www.reddit.com/r/haskell/ Haskell Cafe http://www.haskell.org/mailman/listinfo/haskell-cafe Real World Haskell http://book.realworldhaskell.org/
  • 99. Bonus: References / Resources Channel 9 Lectures (Erik Meijer) http://channel9.msdn.com/Shows/Going+Deep/ Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1 Learn You A Haskell http://learnyouahaskell.com Haskell Reddit http://www.reddit.com/r/haskell/ Haskell Cafe http://www.haskell.org/mailman/listinfo/haskell-cafe Real World Haskell http://book.realworldhaskell.org/
  • 100. Bonus: References / Resources Channel 9 Lectures (Erik Meijer) http://channel9.msdn.com/Shows/Going+Deep/ Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1 Learn You A Haskell http://learnyouahaskell.com Haskell Reddit http://www.reddit.com/r/haskell/ Haskell Cafe http://www.haskell.org/mailman/listinfo/haskell-cafe Real World Haskell http://book.realworldhaskell.org/
  • 101. Bonus: Brief QuickCheck Example module Tests where import Test.QuickCheck (quickCheck) propReverseReverse :: [Char] -> Bool propReverseReverse s = (reverse . reverse) s == s excuse the weird syntax form, indenting didnā€™t show up ;( main = do {quickCheck propReverseReverse }