From Ruby to Haskell (Kansai Yami RubyKaigi)

  • 1,028 views
Uploaded on

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

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

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,028
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
6
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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