why use haskell?

29
Why use Haskell?

Upload: thoughtbot

Post on 12-May-2015

3.034 views

Category:

Technology


0 download

DESCRIPTION

A few times now, I've been asked, "Haskell looks cool, but what should I use it for?" This presentation attempts to showcase some of the unique parts of Haskell in order to make it easier to understand why you might be interested in learning it.

TRANSCRIPT

Page 1: Why Use Haskell?

Why use Haskell?

Page 2: Why Use Haskell?

Haskell was made by some really smart guys (with PhDs).

“- Learn You a Haskell

Page 3: Why Use Haskell?

Haskell is a purely functional programming language.

Page 4: Why Use Haskell?

Easier to Understand

Page 5: Why Use Haskell?

Ruby Haskelldef plan_name @user.account.plan.name end

planName :: User -> String planName = name . plan . account

Page 6: Why Use Haskell?

Ruby Haskelldef slugs(projects) projects. map { |project| project. name. downcase }. uniq end

slugs :: [Project] -> [String] slugs = uniq . map (downcase . projectName)

Page 7: Why Use Haskell?

Less Buggy

• No distinction between pass by reference, pass by value.

• Don’t need to worry about dup, freeze, and friends.

Page 8: Why Use Haskell?

Easier to Write

Page 9: Why Use Haskell?

Ruby Haskelldef combine(elements, new_element) existing_index = elements. find_index { |existing| existing. combinable?(new_element) } if existing_index existing_element = elements. delete_at(existing_index) elements << existing_element. merge(new_element) else elements << new_element end end

combine :: Combinable a => Seq a -> a -> Seq a combine xs x = case existingIndex of Just i -> adjust (combine x) i xs Nothing -> x <| xs where existingIndex = findIndexL (similar x) xs

Page 10: Why Use Haskell?

Paralellization

• Ruby: Thread, Mutex, Semaphore, Locking, Contention

• Haskell: par, pseq

Page 11: Why Use Haskell?

Haskell is lazy.

Page 12: Why Use Haskell?

Clearer Code

Page 13: Why Use Haskell?

Ruby HaskellletterValues :: Int -> [(Char, Int)] letterValues start = zip ['a'..'z'] [start..] !main :: IO () main = do (start:_) <- getArgs mapM_ print $ letterValues $ read start

def letter_values(start) letters = 'a'..'z' letters. zip(start..(letters.count)) end !def main start = ARGV[0].to_i puts letter_values(start). map(&:inspect) end

Page 14: Why Use Haskell?

Ruby HaskellletterValues :: Int -> [(Char, Int)] letterValues start = zip ['a'..'z'] [start..] !main :: IO () main = do (start:_) <- getArgs mapM_ print $ letterValues $ read start

def letter_values(start) ('a'..'z'). each_with_index do |letter, i| [letter, i + start] end end !def main start = ARGV[0].to_i puts letter_values(start). map(&:inspect) end

Page 15: Why Use Haskell?

Better Memory Usage

Page 16: Why Use Haskell?

Ruby HaskellwordsPerLine :: String -> Float wordsPerLine = mean . map (length . words) . lines !main :: IO () main = print . wordsPerLine =<< getContents

def words_per_line(string) string. split("\n"). map { |line| line. split(' '). size }. average end !def main puts words_per_line(STDIN.read) end

Page 17: Why Use Haskell?

Ruby HaskellwordsPerLine :: String -> Float wordsPerLine = mean . map (length . words) . lines !main :: IO () main = print . wordsPerLine =<< getContents

def words_per_line(io) io. each_line. map { |line| line. split(' '). size }. average end !def main puts words_per_line(STDIN) end

Page 18: Why Use Haskell?

Haskell is statically typed.

Page 19: Why Use Haskell?

Clarity

Page 20: Why Use Haskell?
Page 21: Why Use Haskell?

Prelude> :type elemsWithIndex elemsWithIndex :: [b] -> [(b, Int)]

Page 22: Why Use Haskell?

Speed

Page 23: Why Use Haskell?
Page 24: Why Use Haskell?

Type Safety

Page 25: Why Use Haskell?

Ruby Haskellclass Square def initialize(length) @length = length end ! def area @length * @length end end !class Rectangle def initialize(width, length) @width, @length = width, length end ! def area @width * @length end end

class Shape a where area :: a -> Int !data Square = Square Int instance Shape Square where area (Square length) = length * length !data Rectangle = Rectangle Int Int instance Shape Rectangle where area (Rectangle width length) = width * length

Page 26: Why Use Haskell?

Ruby Haskelldef plan_name(user) if user.account user.account.plan.name end end

planName :: User -> String planName user = (name . plan) <$> account user

Page 27: Why Use Haskell?

Ruby Haskelldef plan_name(user) user.account.plan.name end

planName :: User -> String planName user = name $ plan $ account user

Airbrake Error Compile Error

Page 28: Why Use Haskell?

Haskell is fun, safe, and fast.

• Clearer code with types and less boilerplate.

• Fewer bugs with type safety and immutable objects.

• Compiled code runs quickly, even in parallel.

Page 29: Why Use Haskell?

Getting Started

brew install haskell-platform

Learn You a Haskell http://learnyouahaskell.com