SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
From Ruby to Haskell
                            Kansai Yamiruby Kaigi
                                Nov 13, 2011
                              Tatsuhiro Ujihisa




Sunday, 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~
               • GHC



Sunday, 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   main

Sunday, 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     main
Sunday, 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     main
Sunday, 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
                            7


Sunday, 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 module

Sunday, 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 Rational


Sunday, November 13, 2011
Lists
               • [1, 2, 3]
               • 1 : 2 : 3 : []
               • ["a", "b", "c"]
               • [1, 2, "a"] ERROR


Sunday, November 13, 2011
Functions
               • call
                • fa
                • gab
               • define
                • f a = something
                • g a b = something
Sunday, November 13, 2011
Operators
               • call
                • 1+2
                • (+) 1 2
                • 1 `g` 2
               • define
                • a + b = something
Sunday, November 13, 2011
Interesting operators
               •$
                • f (g (h a b)))
                • f$g$hab
               • a : b : c : [] == [a, b, c]
               • expected @=# actual

Sunday, 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 >>= print


Sunday, November 13, 2011
self-introduction



Sunday, November 13, 2011
Tatsuhiro Ujihisa
               • @ujm
               • Vancouver
               • HootSuite media inc
               • Vim


Sunday, November 13, 2011
• http://ujihisa.blogspot.com
               • http://vim-users.jp
               • http://github.com/ujihisa



Sunday, 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     main
Sunday, 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
                                          Fizz
Sunday, 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 n




Sunday, November 13, 2011
map, flip, and for
               • map f list
               • flip map list f
               • mapM_ f list
               • flip mapM_ list f
               • forM_ list f
Sunday, 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 n



Sunday, 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 n



Sunday, November 13, 2011
Haskell as shell scripts
               • Succinct expressions
               • Powerful list-manipulation
               • Powerful text-manipulation
               • Reasonably fast to boot
               • Healthy

Sunday, November 13, 2011
Parsec
               • Parser combinators
               • Standard library
               • No need for handling state
                    explicitly




Sunday, 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 completion
Sunday, November 13, 2011
quickrun.vim
               • DEMO
               • runghc
               • ghc



Sunday, November 13, 2011

Contenu connexe

En vedette

[WebCamp2014] Towards functional web
[WebCamp2014] Towards functional web[WebCamp2014] Towards functional web
[WebCamp2014] Towards functional webBlaž Repas
 
Web programming in Haskell
Web programming in HaskellWeb programming in Haskell
Web programming in Haskellchriseidhof
 
Functional programming seminar (haskell)
Functional programming seminar (haskell)Functional programming seminar (haskell)
Functional programming seminar (haskell)Bikram Thapa
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real Worldosfameron
 
Building a website in Haskell coming from Node.js
Building a website in Haskell coming from Node.jsBuilding a website in Haskell coming from Node.js
Building a website in Haskell coming from Node.jsNicolas Hery
 
Online movie ticket booking
Online movie ticket bookingOnline movie ticket booking
Online movie ticket bookingmrinnovater007
 

En vedette (6)

[WebCamp2014] Towards functional web
[WebCamp2014] Towards functional web[WebCamp2014] Towards functional web
[WebCamp2014] Towards functional web
 
Web programming in Haskell
Web programming in HaskellWeb programming in Haskell
Web programming in Haskell
 
Functional programming seminar (haskell)
Functional programming seminar (haskell)Functional programming seminar (haskell)
Functional programming seminar (haskell)
 
Haskell in the Real World
Haskell in the Real WorldHaskell in the Real World
Haskell in the Real World
 
Building a website in Haskell coming from Node.js
Building a website in Haskell coming from Node.jsBuilding a website in Haskell coming from Node.js
Building a website in Haskell coming from Node.js
 
Online movie ticket booking
Online movie ticket bookingOnline movie ticket booking
Online movie ticket booking
 

Plus de ujihisa

vimconf2013
vimconf2013vimconf2013
vimconf2013ujihisa
 
KOF2013 Minecraft / Clojure
KOF2013 Minecraft / ClojureKOF2013 Minecraft / Clojure
KOF2013 Minecraft / Clojureujihisa
 
Keynote ujihisa.vim#2
Keynote ujihisa.vim#2Keynote ujihisa.vim#2
Keynote ujihisa.vim#2ujihisa
 
vimshell made other shells legacy
vimshell made other shells legacyvimshell made other shells legacy
vimshell made other shells legacyujihisa
 
Text Manipulation with/without Parsec
Text Manipulation with/without ParsecText Manipulation with/without Parsec
Text Manipulation with/without Parsecujihisa
 
CoffeeScript in hootsuite
CoffeeScript in hootsuiteCoffeeScript in hootsuite
CoffeeScript in hootsuiteujihisa
 
HootSuite Dev 2
HootSuite Dev 2HootSuite Dev 2
HootSuite Dev 2ujihisa
 
Ruby Kansai49
Ruby Kansai49Ruby Kansai49
Ruby Kansai49ujihisa
 
Hootsuite dev 2011
Hootsuite dev 2011Hootsuite dev 2011
Hootsuite dev 2011ujihisa
 
LLVM Workshop Osaka Umeda, Japan
LLVM Workshop Osaka Umeda, JapanLLVM Workshop Osaka Umeda, Japan
LLVM Workshop Osaka Umeda, Japanujihisa
 
RubyConf 2009 LT "Termtter"
RubyConf 2009 LT "Termtter"RubyConf 2009 LT "Termtter"
RubyConf 2009 LT "Termtter"ujihisa
 
Hacking parse.y (RubyConf 2009)
Hacking parse.y (RubyConf 2009)Hacking parse.y (RubyConf 2009)
Hacking parse.y (RubyConf 2009)ujihisa
 
Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)ujihisa
 
Hacking Parse.y with ujihisa
Hacking Parse.y with ujihisaHacking Parse.y with ujihisa
Hacking Parse.y with ujihisaujihisa
 
Ruby Kansai #35 About RubyKaigi2009 ujihisa
Ruby Kansai #35 About RubyKaigi2009 ujihisaRuby Kansai #35 About RubyKaigi2009 ujihisa
Ruby Kansai #35 About RubyKaigi2009 ujihisaujihisa
 
Kof2008 Itll
Kof2008 ItllKof2008 Itll
Kof2008 Itllujihisa
 
All About Metarw -- VimM#2
All About Metarw -- VimM#2All About Metarw -- VimM#2
All About Metarw -- VimM#2ujihisa
 
Itc2008 Ujihisa
Itc2008 UjihisaItc2008 Ujihisa
Itc2008 Ujihisaujihisa
 
Agile Web Posting With Ruby / Ruby Kaigi2008
Agile Web Posting With Ruby / Ruby Kaigi2008Agile Web Posting With Ruby / Ruby Kaigi2008
Agile Web Posting With Ruby / Ruby Kaigi2008ujihisa
 
Agile Web Posting with Ruby (lang:ja)
Agile Web Posting with Ruby (lang:ja)Agile Web Posting with Ruby (lang:ja)
Agile Web Posting with Ruby (lang:ja)ujihisa
 

Plus de ujihisa (20)

vimconf2013
vimconf2013vimconf2013
vimconf2013
 
KOF2013 Minecraft / Clojure
KOF2013 Minecraft / ClojureKOF2013 Minecraft / Clojure
KOF2013 Minecraft / Clojure
 
Keynote ujihisa.vim#2
Keynote ujihisa.vim#2Keynote ujihisa.vim#2
Keynote ujihisa.vim#2
 
vimshell made other shells legacy
vimshell made other shells legacyvimshell made other shells legacy
vimshell made other shells legacy
 
Text Manipulation with/without Parsec
Text Manipulation with/without ParsecText Manipulation with/without Parsec
Text Manipulation with/without Parsec
 
CoffeeScript in hootsuite
CoffeeScript in hootsuiteCoffeeScript in hootsuite
CoffeeScript in hootsuite
 
HootSuite Dev 2
HootSuite Dev 2HootSuite Dev 2
HootSuite Dev 2
 
Ruby Kansai49
Ruby Kansai49Ruby Kansai49
Ruby Kansai49
 
Hootsuite dev 2011
Hootsuite dev 2011Hootsuite dev 2011
Hootsuite dev 2011
 
LLVM Workshop Osaka Umeda, Japan
LLVM Workshop Osaka Umeda, JapanLLVM Workshop Osaka Umeda, Japan
LLVM Workshop Osaka Umeda, Japan
 
RubyConf 2009 LT "Termtter"
RubyConf 2009 LT "Termtter"RubyConf 2009 LT "Termtter"
RubyConf 2009 LT "Termtter"
 
Hacking parse.y (RubyConf 2009)
Hacking parse.y (RubyConf 2009)Hacking parse.y (RubyConf 2009)
Hacking parse.y (RubyConf 2009)
 
Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)
 
Hacking Parse.y with ujihisa
Hacking Parse.y with ujihisaHacking Parse.y with ujihisa
Hacking Parse.y with ujihisa
 
Ruby Kansai #35 About RubyKaigi2009 ujihisa
Ruby Kansai #35 About RubyKaigi2009 ujihisaRuby Kansai #35 About RubyKaigi2009 ujihisa
Ruby Kansai #35 About RubyKaigi2009 ujihisa
 
Kof2008 Itll
Kof2008 ItllKof2008 Itll
Kof2008 Itll
 
All About Metarw -- VimM#2
All About Metarw -- VimM#2All About Metarw -- VimM#2
All About Metarw -- VimM#2
 
Itc2008 Ujihisa
Itc2008 UjihisaItc2008 Ujihisa
Itc2008 Ujihisa
 
Agile Web Posting With Ruby / Ruby Kaigi2008
Agile Web Posting With Ruby / Ruby Kaigi2008Agile Web Posting With Ruby / Ruby Kaigi2008
Agile Web Posting With Ruby / Ruby Kaigi2008
 
Agile Web Posting with Ruby (lang:ja)
Agile Web Posting with Ruby (lang:ja)Agile Web Posting with Ruby (lang:ja)
Agile Web Posting with Ruby (lang:ja)
 

Dernier

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 

Dernier (20)

08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 

Kansai Ruby Conference Talk on Haskell

  • 1. From Ruby to Haskell Kansai Yamiruby Kaigi Nov 13, 2011 Tatsuhiro Ujihisa Sunday, November 13, 2011
  • 2. Agenda • Haskell (introduction) • Haskell (for beginners) • Self-introduction • Haskell (for average people) • Haskell (for pro) Sunday, November 13, 2011
  • 4. Haskell • Programming language • 1990~ • GHC Sunday, 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 main Sunday, 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 main Sunday, 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 main 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 7 Sunday, 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 module Sunday, 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 Rational Sunday, November 13, 2011
  • 14. Lists • [1, 2, 3] • 1 : 2 : 3 : [] • ["a", "b", "c"] • [1, 2, "a"] ERROR Sunday, November 13, 2011
  • 15. Functions • call • fa • gab • define • f a = something • g a b = something Sunday, November 13, 2011
  • 16. Operators • call • 1+2 • (+) 1 2 • 1 `g` 2 • define • a + b = something Sunday, November 13, 2011
  • 17. Interesting operators •$ • f (g (h a b))) • f$g$hab • a : b : c : [] == [a, b, c] • expected @=# actual Sunday, 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 >>= print Sunday, November 13, 2011
  • 22. Tatsuhiro Ujihisa • @ujm • Vancouver • HootSuite media inc • Vim Sunday, November 13, 2011
  • 23. • http://ujihisa.blogspot.com • http://vim-users.jp • http://github.com/ujihisa 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 main Sunday, 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 Fizz Sunday, 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 n Sunday, November 13, 2011
  • 31. map, flip, and for • map f list • flip map list f • mapM_ f list • flip mapM_ list f • forM_ list f Sunday, 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 n Sunday, 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 n Sunday, November 13, 2011
  • 34. Haskell as shell scripts • Succinct expressions • Powerful list-manipulation • Powerful text-manipulation • Reasonably fast to boot • Healthy Sunday, November 13, 2011
  • 35. Parsec • Parser combinators • Standard library • No need for handling state explicitly Sunday, 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 completion Sunday, November 13, 2011
  • 38. quickrun.vim • DEMO • runghc • ghc Sunday, November 13, 2011