Download - Why Use Haskell?

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


Top Related