From Ruby to Haskell (Kansai Yami RubyKaigi)
Upcoming SlideShare
Loading in...5
×
 

From Ruby to Haskell (Kansai Yami RubyKaigi)

on

  • 1,248 views

for http://cotocoto.jp/event/46352

for http://cotocoto.jp/event/46352

Statistics

Views

Total Views
1,248
Views on SlideShare
1,231
Embed Views
17

Actions

Likes
2
Downloads
5
Comments
0

2 Embeds 17

http://paper.li 12
http://a0.twimg.com 5

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    From Ruby to Haskell (Kansai Yami RubyKaigi) From Ruby to Haskell (Kansai Yami RubyKaigi) Presentation Transcript

    • From Ruby to Haskell Kansai Yamiruby Kaigi Nov 13, 2011 Tatsuhiro UjihisaSunday, November 13, 2011
    • Agenda • Haskell (introduction) • Haskell (for beginners) • Self-introduction • Haskell (for average people) • Haskell (for pro)Sunday, November 13, 2011
    • Haskell (1/3)Sunday, November 13, 2011
    • Haskell • Programming language • 1990~ • GHCSunday, November 13, 2011
    • Haskell • Strong static-typed • Interpreter & native compiler • Lazy evaluation main = print "hello"Sunday, November 13, 2011
    • FizzBuzz in Ruby 1 (1..100).each do |i| 1 def main 2 puts fizzbuzz 2 puts i % 15 == 0 ? FizzBuzz : 3 end 3 i % 5 == 0 ? Buzz : 4 4 i % 3 == 0 ? Fizz : 5 def fizzbuzz 5 i 6 (1..100).map {|i| 6 end 7 i % 15 == 0 ? FizzBuzz : 8 i % 5 == 0 ? Buzz : 9 i % 3 == 0 ? Fizz : 10 i 11 } 12 end 13 14 mainSunday, November 13, 2011
    • FizzBuzz in Ruby 1 def main 1 def main 2 puts fizzbuzz 2 puts fizzbuzz 3 end 3 end 4 4 5 def fizzbuzz 5 def fizzbuzz 6 f = -> i do 6 (1..100).map {|i| 7 i % 15 == 0 ? FizzBuzz : 7 i % 15 == 0 ? FizzBuzz : 8 i % 5 == 0 ? Buzz : 8 i % 5 == 0 ? Buzz : 9 i % 3 == 0 ? Fizz : 9 i % 3 == 0 ? Fizz : 10 i 10 i 11 end 11 } 12 (1..100).map &f 12 end 13 end 13 14 14 main 15 mainSunday, November 13, 2011
    • FizzBuzz in Haskell 1 def main 1 main = print fizzbuzz 2 puts fizzbuzz 2 3 end 3 fizzbuzz = map f [1..100] 4 4 where f n 5 def fizzbuzz 5 | n `rem` 15 == 0 = "FizzBuzz" 6 f = -> i do 6 | n `rem` 5 == 0 = "Buzz" 7 i % 15 == 0 ? FizzBuzz : 7 | n `rem` 3 == 0 = "Fizz" 8 i % 5 == 0 ? Buzz : 8 | otherwise = show n 9 i % 3 == 0 ? Fizz : 10 i 11 end 12 (1..100).map &f 13 end 14 15 mainSunday, November 13, 2011
    • Haskell (2/3)Sunday, November 13, 2011
    • 1 main = print (a + b) 1 main = print (a + b) 2 a=1 2 a = 1 :: Int 3 b=2 3 b :: Int 4 b=2 1 main = print (a + b) 2 a = 1 :: Int 1 a.hs:4:5: 3 b :: Int 2 No instance for (Fractional Int) 4 b = 2.1 3 arising from the literal `2.1 4 Possible fix: add an instance declaration for (Fractional Int) 5 In the expression: 2.1 6 In an equation for `b: b = 2.1 7Sunday, November 13, 2011
    • Type and type-class • type (in Haskell) =~ class (in Ruby) • type class (in Haskell) =~ module (in Ruby) • Int type =~ Fixnum class • Num type-class =~ Numeric moduleSunday, November 13, 2011
    • Literals • Ruby: only one type • 1 (always Fixnum) • "hello" (always String) • Haskell: compiler infers • 1 (Int? Integer? Float? Rational?) • "a" (String? Test? ByteString?)Sunday, November 13, 2011
    • 1 main = print (a + b) error 2 a = 1 :: Int 3 b = 2.1 1 main = print (a + b) ok 2 a=1 3 b = 2.1 b and (a+b) can be Float, Double or RationalSunday, November 13, 2011
    • Lists • [1, 2, 3] • 1 : 2 : 3 : [] • ["a", "b", "c"] • [1, 2, "a"] ERRORSunday, November 13, 2011
    • Functions • call • fa • gab • define • f a = something • g a b = somethingSunday, November 13, 2011
    • Operators • call • 1+2 • (+) 1 2 • 1 `g` 2 • define • a + b = somethingSunday, November 13, 2011
    • Interesting operators •$ • f (g (h a b))) • f$g$hab • a : b : c : [] == [a, b, c] • expected @=# actualSunday, November 13, 2011
    • Combining actions main = print [1, 2, 3] >> print "hi" 1 main = do 2 print [1, 2, 3] 3 print "hi" main = do { print [1, 2, 3]; print "hi" }Sunday, November 13, 2011
    • only for side effect • Ruby • puts hi puts yo • Haskell • puts hi; puts yo • do putStrLn "hi" putStrLn "yo" • putStrLn "hi" >> putStrLn "yo"Sunday, November 13, 2011
    • side effect to get a val • Ruby •Haskell • a = gets • do pa a <- getContent print a • getContent >>= printSunday, November 13, 2011
    • self-introductionSunday, November 13, 2011
    • Tatsuhiro Ujihisa • @ujm • Vancouver • HootSuite media inc • VimSunday, November 13, 2011
    • • http://ujihisa.blogspot.com • http://vim-users.jp • http://github.com/ujihisaSunday, November 13, 2011
    • Haskell (3/3)Sunday, November 13, 2011
    • re: FizzBuzz in Haskell 1 def main 1 main = print fizzbuzz 2 puts fizzbuzz 2 3 end 3 fizzbuzz = map f [1..100] 4 4 where f n 5 def fizzbuzz 5 | n `rem` 15 == 0 = "FizzBuzz" 6 f = -> i do 6 | n `rem` 5 == 0 = "Buzz" 7 i % 15 == 0 ? FizzBuzz : 7 | n `rem` 3 == 0 = "Fizz" 8 i % 5 == 0 ? Buzz : 8 | otherwise = show n 9 i % 3 == 0 ? Fizz : 10 i 11 end 12 (1..100).map &f 13 end 14 15 mainSunday, November 13, 2011
    • output 1 main = print fizzbuzz ["1","2","Fizz","4","Buzz","Fiz 2 z","7","8","Fizz","Buzz","11"," 3 fizzbuzz = map f [1..100] Fizz","13","14","FizzBuzz","16 4 where f n ","17","Fizz","19","Buzz","Fizz ","22","23","Fizz","Buzz","26", 5 | n `rem` 15 == 0 = "FizzBuzz" "Fizz","28","29","FizzBuzz","3 6 | n `rem` 5 == 0 = "Buzz" 1","32","Fizz","34","Buzz","Fiz 7 | n `rem` 3 == 0 = "Fizz" z","37","38","Fizz","Buzz","41 8 | otherwise = show n ","Fizz","43","44","FizzBuzz"," 46","47","Fizz","49","Buzz","F izz","52","53","Fizz","Buzz","5 6","Fizz","58","59","FizzBuzz" ,"61","62","Fizz","64","Buzz"," like p Fizz","67","68","Fizz","Buzz"," 71","Fizz","73","74","FizzBuzz ","76","77","Fizz","79","Buzz",Sunday, November 13, 2011 "Fizz","82","83","Fizz","Buzz",
    • output 1 1 main = mapM_ putStrLn fizzbuzz 2 2 Fizz 4 3 fizzbuzz = map f [1..100] Buzz 4 where f n Fizz 7 5 | n `rem` 15 == 0 = "FizzBuzz" 8 6 | n `rem` 5 == 0 = "Buzz" Fizz Buzz 7 | n `rem` 3 == 0 = "Fizz" 11 Fizz 8 | otherwise = show n 13 14 FizzBuzz 16 17 Fizz 19 like puts Buzz Fizz 22 23 FizzSunday, November 13, 2011
    • mapM_ • f x >> f y >> f z • do fx fy fz • mapM_ f [x, y, z]Sunday, November 13, 2011
    • mapM_ • ((f x) >> f y) >> f z • foldl1 (>>) $ map f [x, y, z] • f x >> (f y >> (f z)) • foldr1 (>>) $ map f [x, y, z] • sequence_ (map f [x, y, z])Sunday, November 13, 2011
    • 1 main = mapM_ putStrLn fizzbuzz 1 main = mapM_ putStrLn fizzbuzz 2 2 3 fizzbuzz = map f [1..100] 3 fizzbuzz = map f [1..100] 4 where f n 4 where f n = case () of 5 | n `rem` 15 == 0 = "FizzBuzz" 5 n `rem` 15 == 0 -> "FizzBuzz" 6 | n `rem` 5 == 0 = "Buzz" 6 n `rem` 5 == 0 -> "Buzz" 7 | n `rem` 3 == 0 = "Fizz" 7 n `rem` 3 == 0 -> "Fizz" 8 | otherwise = show n 8 otherwise -> show nSunday, November 13, 2011
    • map, flip, and for • map f list • flip map list f • mapM_ f list • flip mapM_ list f • forM_ list fSunday, November 13, 2011
    • 1 main = mapM_ putStrLn fizzbuzz 2 3 fizzbuzz = map f [1..100] 4 where f n = case () of _ 5 | n `rem` 15 == 0 -> "FizzBuzz" 6 | n `rem` 5 == 0 -> "Buzz" 7 | n `rem` 3 == 0 -> "Fizz" 1 import Control.Monad (forM_) 8 | otherwise -> show n 2 main = forM_ [1..100] f 3 where 4 f n = putStrLn $ case () of _ 5 | n `rem` 15 == 0 -> "FizzBuzz" 6 | n `rem` 5 == 0 -> "Buzz" 7 | n `rem` 3 == 0 -> "Fizz" 8 | otherwise -> show nSunday, November 13, 2011
    • 1 import Control.Monad (forM_) 2 main = forM_ [1..100] $ n -> 3 putStrLn $ case () of _ 4 | n `rem` 15 == 0 -> "FizzBuzz" 5 | n `rem` 5 == 0 -> "Buzz" 6 | n `rem` 3 == 0 -> "Fizz" 1 import Control.Monad (forM_)7 | otherwise -> show n 2 main = forM_ [1..100] f 3 where 4 f n = putStrLn $ case () of _ 5 | n `rem` 15 == 0 -> "FizzBuzz" 6 | n `rem` 5 == 0 -> "Buzz" 7 | n `rem` 3 == 0 -> "Fizz" 8 | otherwise -> show nSunday, November 13, 2011
    • Haskell as shell scripts • Succinct expressions • Powerful list-manipulation • Powerful text-manipulation • Reasonably fast to boot • HealthySunday, November 13, 2011
    • Parsec • Parser combinators • Standard library • No need for handling state explicitlySunday, November 13, 2011
    • Haskell web framework • Yesod • Snap (framework) •Sunday, November 13, 2011
    • Appendix • IDE-integration • run on the IDE • keyword completion • Prelude type/function completion • module name completion • third party t/f completion • pragma completionSunday, November 13, 2011
    • quickrun.vim • DEMO • runghc • ghcSunday, November 13, 2011