From Ruby to Haskell                            Kansai Yamiruby Kaigi                                Nov 13, 2011         ...
Agenda               • Haskell (introduction)               • Haskell (for beginners)               • Self-introduction   ...
Haskell (1/3)Sunday, November 13, 2011
Haskell               • Programming language               • 1990~               • GHCSunday, November 13, 2011
Haskell               • Strong static-typed               • Interpreter & native compiler               • Lazy evaluation ...
FizzBuzz in Ruby 1 (1..100).each do |i|               1   def main                                      2    puts fizzbuzz ...
FizzBuzz in Ruby            1     def main                         1   def main            2      puts fizzbuzz            ...
FizzBuzz in Haskell            1     def main                      1 main = print fizzbuzz            2      puts fizzbuzz  ...
Haskell (2/3)Sunday, November 13, 2011
1 main = print (a + b)                        1   main = print (a + b)       2 a=1                                        ...
Type and type-class               • type (in Haskell) =~ class (in Ruby)               • type class (in Haskell) =~       ...
Literals               • Ruby: only one type                • 1 (always Fixnum)                • "hello" (always String)  ...
1 main = print (a + b)                      error      2 a = 1 :: Int                                 3 b = 2.1           ...
Lists               • [1, 2, 3]               • 1 : 2 : 3 : []               • ["a", "b", "c"]               • [1, 2, "a"]...
Functions               • call                • fa                • gab               • define                • f a = somet...
Operators               • call                • 1+2                • (+) 1 2                • 1 `g` 2               • defin...
Interesting operators               •$                • f (g (h a b)))                • f$g$hab               • a : b : c ...
Combining actions                             main = print [1, 2, 3] >> print "hi"                                       1...
only for side effect                                  • Ruby                                   • puts hi                   ...
side effect to get a val               • Ruby            •Haskell                • a = gets        • do                    ...
self-introductionSunday, November 13, 2011
Tatsuhiro Ujihisa               • @ujm               • Vancouver               • HootSuite media inc               • VimSu...
• http://ujihisa.blogspot.com               • http://vim-users.jp               • http://github.com/ujihisaSunday, Novembe...
Haskell (3/3)Sunday, November 13, 2011
re: FizzBuzz in Haskell            1     def main                      1 main = print fizzbuzz            2      puts fizzbu...
output   1 main = print fizzbuzz                  ["1","2","Fizz","4","Buzz","Fiz   2                                      ...
output                                          1   1 main = mapM_ putStrLn fizzbuzz        2   2                          ...
mapM_               • f x >> f y >> f z               • do                       fx                       fy              ...
mapM_               • ((f x) >> f y) >> f z               • foldl1 (>>) $ map f [x, y, z]               • f x >> (f y >> (...
1 main = mapM_ putStrLn fizzbuzz        1 main = mapM_ putStrLn fizzbuzz   2                                      2   3 fizzb...
map, flip, and for               • map f list               • flip map list f               • mapM_ f list               • fl...
1 main = mapM_ putStrLn fizzbuzz                                       2                                       3 fizzbuzz = ...
1 import Control.Monad (forM_)                                   2 main = forM_ [1..100] $ n ->                           ...
Haskell as shell scripts               • Succinct expressions               • Powerful list-manipulation               • P...
Parsec               • Parser combinators               • Standard library               • No need for handling state     ...
Haskell web framework               • Yesod               • Snap (framework)               •Sunday, November 13, 2011
Appendix               • IDE-integration                • run on the IDE                • keyword completion              ...
quickrun.vim               • DEMO               • runghc               • ghcSunday, November 13, 2011
Upcoming SlideShare
Loading in...5
×

From Ruby to Haskell (Kansai Yami RubyKaigi)

1,181

Published on

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

Published in: Technology, Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,181
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

From Ruby to Haskell (Kansai Yami RubyKaigi)

  1. 1. From Ruby to Haskell Kansai Yamiruby Kaigi Nov 13, 2011 Tatsuhiro UjihisaSunday, November 13, 2011
  2. 2. Agenda • Haskell (introduction) • Haskell (for beginners) • Self-introduction • Haskell (for average people) • Haskell (for pro)Sunday, November 13, 2011
  3. 3. Haskell (1/3)Sunday, November 13, 2011
  4. 4. Haskell • Programming language • 1990~ • GHCSunday, November 13, 2011
  5. 5. Haskell • Strong static-typed • Interpreter & native compiler • Lazy evaluation main = print "hello"Sunday, November 13, 2011
  6. 6. 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
  7. 7. 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
  8. 8. 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
  9. 9. Haskell (2/3)Sunday, November 13, 2011
  10. 10. 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
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. Lists • [1, 2, 3] • 1 : 2 : 3 : [] • ["a", "b", "c"] • [1, 2, "a"] ERRORSunday, November 13, 2011
  15. 15. Functions • call • fa • gab • define • f a = something • g a b = somethingSunday, November 13, 2011
  16. 16. Operators • call • 1+2 • (+) 1 2 • 1 `g` 2 • define • a + b = somethingSunday, November 13, 2011
  17. 17. Interesting operators •$ • f (g (h a b))) • f$g$hab • a : b : c : [] == [a, b, c] • expected @=# actualSunday, November 13, 2011
  18. 18. 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
  19. 19. 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
  20. 20. side effect to get a val • Ruby •Haskell • a = gets • do pa a <- getContent print a • getContent >>= printSunday, November 13, 2011
  21. 21. self-introductionSunday, November 13, 2011
  22. 22. Tatsuhiro Ujihisa • @ujm • Vancouver • HootSuite media inc • VimSunday, November 13, 2011
  23. 23. • http://ujihisa.blogspot.com • http://vim-users.jp • http://github.com/ujihisaSunday, November 13, 2011
  24. 24. Haskell (3/3)Sunday, November 13, 2011
  25. 25. 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
  26. 26. 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",
  27. 27. 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
  28. 28. mapM_ • f x >> f y >> f z • do fx fy fz • mapM_ f [x, y, z]Sunday, November 13, 2011
  29. 29. 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
  30. 30. 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
  31. 31. map, flip, and for • map f list • flip map list f • mapM_ f list • flip mapM_ list f • forM_ list fSunday, November 13, 2011
  32. 32. 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
  33. 33. 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
  34. 34. Haskell as shell scripts • Succinct expressions • Powerful list-manipulation • Powerful text-manipulation • Reasonably fast to boot • HealthySunday, November 13, 2011
  35. 35. Parsec • Parser combinators • Standard library • No need for handling state explicitlySunday, November 13, 2011
  36. 36. Haskell web framework • Yesod • Snap (framework) •Sunday, November 13, 2011
  37. 37. 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
  38. 38. quickrun.vim • DEMO • runghc • ghcSunday, November 13, 2011
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×