SlideShare ist ein Scribd-Unternehmen logo
1 von 103
Downloaden Sie, um offline zu lesen
Haskell is Not
For Production
and Other Tales
by Katie Miller (@codemiller)
Software Engineer at Facebook
So what do
you code in?
Oh Pascal,
cool
Wait...what? You
have Haskell in prod?
more than 1 million
requests/second
Haskell is
academic
Haskell is
difficult
Haskell is
panacean
Haskell is
Haxl
fpSpammer	
  ::	
  Haxl	
  Bool	
  
fpSpammer	
  =	
  	
  
	
  	
  talkingAboutMonads	
  .&&	
  
	
  	
  numFriends	
  .>	
  100	
  .&&	
  
	
  	
  friendsLikePython	
  
	
  	
  where	
  
	
  	
  talkingAboutMonads	
  =	
  
	
  	
  	
  	
  strContains	
  "monad"	
  <$>	
  postContent	
  
	
  	
  friendsLikePython	
  =	
  do	
  
	
  	
  	
  	
  friends	
  <-­‐	
  getFriends	
  
	
  	
  	
  	
  pyFriends	
  <-­‐	
  filterM	
  likesPython	
  friends	
  
	
  	
  	
  	
  return	
  (length	
  pyFriends	
  >=	
  
	
  	
  	
  	
  	
  	
  length	
  friends	
  `div`	
  2)	
  
efficient data
fetching
 	
  {-­‐#	
  LANGUAGE	
  ApplicativeDo	
  #-­‐}	
  
	
  	
  friendsLikePython	
  =	
  do	
  
	
  	
  	
  	
  friends	
  <-­‐	
  getFriends	
  
	
  	
  	
  	
  pyFriends	
  <-­‐	
  filterM	
  likesPython	
  friends	
  
	
  	
  	
  	
  return	
  (length	
  pyFriends	
  >=	
  
	
  	
  	
  	
  	
  	
  length	
  friends	
  `div`	
  2)
open source
Haskell is
academic
Source: https://xkcd.com/1312
Source: Bitcheese.net
Source: Bitcheese.net
Haskell came from
academia
Source: A History of Haskell: Being Lazy With Class
Haskell is used
in industry
AT&T
Barclays
Facebook
Google
Microsoft
New York Times
Standard Chartered
AT&T
Barclays
Facebook
Google
Microsoft
New York Times
Standard Chartered
CircuitHub
Fynder
Hasura
Helium
Pusher
Scrive
Wagon
Source: Hacker News
why Haskell
reasoning about code
purity
strong static typing
userHasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Haxl	
  Bool	
  
userHasAssoc	
  assoc	
  target	
  =	
  ...
userHasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Haxl	
  Bool	
  
userHasAssoc	
  assoc	
  target	
  =	
  ...
newtype	
  Id	
  =	
  Id	
  Int	
  
newtype	
  AssocId	
  =	
  AssocId	
  Int
userHasAssoc	
  ::	
  Int	
  -­‐>	
  Int	
  -­‐>	
  Haxl	
  Bool	
  
userHasAssoc	
  assoc	
  target	
  =	
  ...
newtype	
  Id	
  =	
  Id	
  Int	
  
newtype	
  AssocId	
  =	
  AssocId	
  Int
userHasAssoc	
  ::	
  AssocId	
  -­‐>	
  Id	
  -­‐>	
  Haxl	
  Bool	
  
userHasAssoc	
  assoc	
  target	
  =	
  ...
abstract away from
concurrency
Haskell performs
Haskell is
difficult
Haskell is
difficult to learn
Haskell is
difficult to debug
Haskellers are
difficult to hire
Haskellers are
difficult
Haskell is
difficult to learn
Source: https://m.imgur.com/E7zzQ3z
Haskell is
difficult
Haskell is
different
expectations
abstraction
Source: http://i.imgur.com/TTBBeJs.jpg
"FP is simple.
The core ideas are simple.
Abstraction can be hard.
It doesn't mean it's not worth learning."
- John Hughes
increases
productivity
vim
dozens learnt Haxl
in three days
we didn't mention
monads
Haskell is
difficult to debug
the cost of laziness
replayability
Haskellers are
difficult to hire
embarrassment
of riches
developers can
learn Haskell
Haskellers are
difficult
Source: https://xkcd.com/1270
elitism
intellectual
territoriality
no respect
why
jargon
unthinking or
pretentious
documentation
community
Haskell is
panacean
Source: https://i.imgur.com/Sex1E8m.jpg
bad Haskell code
blockAustralians	
  ::	
  Haxl	
  SyncResponses	
  
blockAustralians	
  =	
  do	
  
	
  	
  textMap	
  <-­‐	
  textArr	
  
	
  	
  let	
  text	
  =	
  HashMap.lookupDefault	
  ""	
  "main_text"	
  textMap	
  
	
  	
  	
  	
  	
  	
  numBadWords	
  	
  	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieTerms	
  
	
  	
  	
  	
  	
  	
  numBadPhrases	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieSayings	
  
	
  	
  if	
  numBadWords	
  <	
  2	
  &&	
  numBadPhrases	
  <=	
  0	
  
	
  	
  then	
  return	
  noResponses	
  
	
  	
  else	
  
	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  4	
  &&	
  numBadPhrases	
  <	
  2	
  
	
  	
  	
  	
  	
  	
  then	
  return	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  5	
  &&	
  numBadPhrases	
  <	
  3	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  requireCaptcha]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  7	
  &&	
  numBadPhrases	
  <	
  4	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  warnUser	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  8	
  &&	
  numBadPhrases	
  <	
  5	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  blockAccess]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  10	
  &&	
  numBadPhrases	
  <	
  6	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  13	
  &&	
  numBadPhrases	
  <	
  7	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  where	
  
	
  	
  	
  	
  	
  	
  aussieTerms	
  =	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  "Acca	
  Dacca"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "ambo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "arvo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "Aussie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "bangaroo"
blockAustralians	
  ::	
  Haxl	
  SyncResponses	
  
blockAustralians	
  =	
  do	
  
	
  	
  textMap	
  <-­‐	
  textArr	
  
	
  	
  let	
  text	
  =	
  HashMap.lookupDefault	
  ""	
  "main_text"	
  textMap	
  
	
  	
  	
  	
  	
  	
  numBadWords	
  	
  	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieTerms	
  
	
  	
  	
  	
  	
  	
  numBadPhrases	
  =	
  length	
  $	
  filter	
  (`Text.isInfixOf`	
  text)	
  aussieSayings	
  
	
  	
  if	
  numBadWords	
  <	
  2	
  &&	
  numBadPhrases	
  <=	
  0	
  
	
  	
  then	
  return	
  noResponses	
  
	
  	
  else	
  
	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  4	
  &&	
  numBadPhrases	
  <	
  2	
  
	
  	
  	
  	
  	
  	
  then	
  return	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  5	
  &&	
  numBadPhrases	
  <	
  3	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  requireCaptcha]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  7	
  &&	
  numBadPhrases	
  <	
  4	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  warnUser	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  8	
  &&	
  numBadPhrases	
  <	
  5	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  [warnUser,	
  blockAccess]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  10	
  &&	
  numBadPhrases	
  <	
  6	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  numBadWords	
  <	
  13	
  &&	
  numBadPhrases	
  <	
  7	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  then	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  return	
  $	
  responses	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  blockAccess	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  enrollInFakeAccountCheckpoint	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  requireCaptcha	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  where	
  
	
  	
  	
  	
  	
  	
  aussieTerms	
  =	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  [	
  "Acca	
  Dacca"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "ambo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "arvo"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "Aussie"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ,	
  "bangaroo"
Source: Twitter
what programmers
think in
half technology and
half religion
legacy of influence
Haskell is academic
and practical
Haskell is different;
that brings benefits and challenges
Haskell is a tool,
not utopia
open source =
opportunity
Haxl team
past and present
Katie Miller
Bartosz Nitka
Jon Purdy
Aaron Roth
Zejun Wu
Noam Zilberstein
š
Louis Brandy
Jonathan Coens
Andrew Farmer
Kubo Kovác
Jake Lengyel
Simon Marlow
Image credits
Story Time (Elliot Margolies, CC BY-NC-ND 2.0)
References
Ben Ford, Haskell at Fynder
David Crystal, The Story of 100 English Words
From Zero to HIPster (Haskell in Production)
Haskell in Industry
Hudak et al, A History of Haskell: Being Lazy With Class
Paul Graham, Beating the Averages
Philip Wadler, Propositions as Types
Sarah Sharp, What Makes a Good Community?
Simon Yang, My Journey into Haskell
More about Haxl
Haxl on GitHub
'Fighting spam with Haskell' blog post
'There is no Fork' ICFP paper and presentation
'The Road to Running Haskell at Facebook Scale'
presentation
Wired article
Haskell is for
production
Haskell is for
production
The End

Weitere ähnliche Inhalte

Was ist angesagt?

Jonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit RakudoJonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit Rakudorit2010
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks Felipe Prado
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8PrinceGuru MS
 
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsProfiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsJano Suchal
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)guregu
 
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Cliff Seal
 
Modern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlModern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlNova Patch
 
Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Molly Struve
 
What's New in the PHP Driver
What's New in the PHP DriverWhat's New in the PHP Driver
What's New in the PHP DriverMongoDB
 
An (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonAn (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonNicholas Tollervey
 
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESDrupalCamp Kyiv
 
Password Security
Password SecurityPassword Security
Password SecurityAlex Hyer
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffsYukiya Hayashi
 
Tulsa techfest2010 security
Tulsa techfest2010   securityTulsa techfest2010   security
Tulsa techfest2010 securityJason Ragsdale
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Fabien Potencier
 
Concept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationConcept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationSeiji Takahashi
 

Was ist angesagt? (19)

Jonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit RakudoJonathan Worthington – Perl 2010 Rit Rakudo
Jonathan Worthington – Perl 2010 Rit Rakudo
 
DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks DEF CON 23 - amit ashbel and maty siman - game of hacks
DEF CON 23 - amit ashbel and maty siman - game of hacks
 
Perl object ?
Perl object ?Perl object ?
Perl object ?
 
Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8Corephpcomponentpresentation 1211425966721657-8
Corephpcomponentpresentation 1211425966721657-8
 
Profiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applicationsProfiling and monitoring ruby & rails applications
Profiling and monitoring ruby & rails applications
 
神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)神に近づくx/net/context (Finding God with x/net/context)
神に近づくx/net/context (Finding God with x/net/context)
 
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
Temporary Cache Assistance (Transients API): WordCamp Birmingham 2014
 
Modern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in PerlModern Getopt for Command Line Processing in Perl
Modern Getopt for Command Line Processing in Perl
 
Cache is King - RailsConf 2019
Cache is King - RailsConf 2019Cache is King - RailsConf 2019
Cache is King - RailsConf 2019
 
What's New in the PHP Driver
What's New in the PHP DriverWhat's New in the PHP Driver
What's New in the PHP Driver
 
An (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonAn (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to Python
 
What Is Security
What Is SecurityWhat Is Security
What Is Security
 
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICESONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
ONE MORE TIME ABOUT CODE STANDARDS AND BEST PRACTICES
 
Password Security
Password SecurityPassword Security
Password Security
 
How to get rid of terraform plan diffs
How to get rid of terraform plan diffsHow to get rid of terraform plan diffs
How to get rid of terraform plan diffs
 
Tulsa techfest2010 security
Tulsa techfest2010   securityTulsa techfest2010   security
Tulsa techfest2010 security
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
 
mod_rewrite
mod_rewritemod_rewrite
mod_rewrite
 
Concept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized ApplicationConcept of BlockChain & Decentralized Application
Concept of BlockChain & Decentralized Application
 

Andere mochten auch

High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance HaskellJohan Tibell
 
Pursuing the Strong, Not So Silent Type: A Haskell Story
Pursuing the Strong, Not So Silent Type: A Haskell StoryPursuing the Strong, Not So Silent Type: A Haskell Story
Pursuing the Strong, Not So Silent Type: A Haskell StoryKatie Ots
 
Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Tom Faulhaber
 
Haskell vs. F# vs. Scala
Haskell vs. F# vs. ScalaHaskell vs. F# vs. Scala
Haskell vs. F# vs. Scalapt114
 
Faster persistent data structures through hashing
Faster persistent data structures through hashingFaster persistent data structures through hashing
Faster persistent data structures through hashingJohan Tibell
 
Protecting Your SsaSets 01.07.10
Protecting Your SsaSets 01.07.10Protecting Your SsaSets 01.07.10
Protecting Your SsaSets 01.07.10michael keyes
 
Aplicación CRM Analytics (spanish)
Aplicación CRM Analytics (spanish)Aplicación CRM Analytics (spanish)
Aplicación CRM Analytics (spanish)Stratebi
 
Lionel Barzon III: Four Digital Skills For Your Career
Lionel Barzon III: Four Digital Skills For Your CareerLionel Barzon III: Four Digital Skills For Your Career
Lionel Barzon III: Four Digital Skills For Your CareerLionel Barzon III
 
jQuery sans jQuery
jQuery sans jQueryjQuery sans jQuery
jQuery sans jQuerygoldoraf
 
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales Boletin Septiembre - Destacan trabajo del CNE en procesos electorales
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales Dra. Roxana Silva Ch.
 
LNUG - A year with AWS
LNUG - A year with AWSLNUG - A year with AWS
LNUG - A year with AWSAndrew Clarke
 
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus..."Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...Sherry Jones
 
25 Ways to Spot a Graphic Designer
25 Ways to Spot a Graphic Designer25 Ways to Spot a Graphic Designer
25 Ways to Spot a Graphic DesignerLogo Design Guru
 
A Creative Design Agency & Printing Press
A Creative Design Agency & Printing Press A Creative Design Agency & Printing Press
A Creative Design Agency & Printing Press KS Designers
 
2011년도 원광대학교 컴퓨터공학과 소개자료
2011년도 원광대학교 컴퓨터공학과 소개자료2011년도 원광대학교 컴퓨터공학과 소개자료
2011년도 원광대학교 컴퓨터공학과 소개자료창여 김창여
 

Andere mochten auch (19)

High-Performance Haskell
High-Performance HaskellHigh-Performance Haskell
High-Performance Haskell
 
Pursuing the Strong, Not So Silent Type: A Haskell Story
Pursuing the Strong, Not So Silent Type: A Haskell StoryPursuing the Strong, Not So Silent Type: A Haskell Story
Pursuing the Strong, Not So Silent Type: A Haskell Story
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)Efficient Immutable Data Structures (Okasaki for Dummies)
Efficient Immutable Data Structures (Okasaki for Dummies)
 
Haskell vs. F# vs. Scala
Haskell vs. F# vs. ScalaHaskell vs. F# vs. Scala
Haskell vs. F# vs. Scala
 
Faster persistent data structures through hashing
Faster persistent data structures through hashingFaster persistent data structures through hashing
Faster persistent data structures through hashing
 
Twitter työkäytössä
Twitter työkäytössäTwitter työkäytössä
Twitter työkäytössä
 
Protecting Your SsaSets 01.07.10
Protecting Your SsaSets 01.07.10Protecting Your SsaSets 01.07.10
Protecting Your SsaSets 01.07.10
 
Aplicación CRM Analytics (spanish)
Aplicación CRM Analytics (spanish)Aplicación CRM Analytics (spanish)
Aplicación CRM Analytics (spanish)
 
Lionel Barzon III: Four Digital Skills For Your Career
Lionel Barzon III: Four Digital Skills For Your CareerLionel Barzon III: Four Digital Skills For Your Career
Lionel Barzon III: Four Digital Skills For Your Career
 
jQuery sans jQuery
jQuery sans jQueryjQuery sans jQuery
jQuery sans jQuery
 
Git Quick Intro
Git Quick IntroGit Quick Intro
Git Quick Intro
 
El periodico en el aula
El periodico en el aula El periodico en el aula
El periodico en el aula
 
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales Boletin Septiembre - Destacan trabajo del CNE en procesos electorales
Boletin Septiembre - Destacan trabajo del CNE en procesos electorales
 
LNUG - A year with AWS
LNUG - A year with AWSLNUG - A year with AWS
LNUG - A year with AWS
 
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus..."Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...
"Machinima: Symbiosis of the Participatory Digital Culture and the Game Indus...
 
25 Ways to Spot a Graphic Designer
25 Ways to Spot a Graphic Designer25 Ways to Spot a Graphic Designer
25 Ways to Spot a Graphic Designer
 
A Creative Design Agency & Printing Press
A Creative Design Agency & Printing Press A Creative Design Agency & Printing Press
A Creative Design Agency & Printing Press
 
2011년도 원광대학교 컴퓨터공학과 소개자료
2011년도 원광대학교 컴퓨터공학과 소개자료2011년도 원광대학교 컴퓨터공학과 소개자료
2011년도 원광대학교 컴퓨터공학과 소개자료
 

Ähnlich wie Haskell is Not For Production and Other Tales

Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Cliff Seal
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB jhchabran
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday DeveloperRoss Tuck
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in OptimizationDavid Golden
 
Drupal & javascript
Drupal & javascriptDrupal & javascript
Drupal & javascriptAlmog Baku
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6garux
 
Introducing ruby on rails
Introducing ruby on railsIntroducing ruby on rails
Introducing ruby on railsPriceen
 
Banishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPBanishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPDavid Hayes
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodJeremy Kendall
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesLuis Curo Salvatierra
 
Speed Things Up with Transients
Speed Things Up with TransientsSpeed Things Up with Transients
Speed Things Up with TransientsCliff Seal
 
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsJava Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsIMC Institute
 
Scaling Databases with DBIx::Router
Scaling Databases with DBIx::RouterScaling Databases with DBIx::Router
Scaling Databases with DBIx::RouterPerrin Harkins
 
Parsing with Perl6 Grammars
Parsing with Perl6 GrammarsParsing with Perl6 Grammars
Parsing with Perl6 Grammarsabrummett
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 

Ähnlich wie Haskell is Not For Production and Other Tales (20)

Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
Temporary Cache Assistance (Transients API): WordCamp Phoenix 2014
 
Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB Introduction à CoffeeScript pour ParisRB
Introduction à CoffeeScript pour ParisRB
 
Redis for the Everyday Developer
Redis for the Everyday DeveloperRedis for the Everyday Developer
Redis for the Everyday Developer
 
Adventures in Optimization
Adventures in OptimizationAdventures in Optimization
Adventures in Optimization
 
Drupal & javascript
Drupal & javascriptDrupal & javascript
Drupal & javascript
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Introducing ruby on rails
Introducing ruby on railsIntroducing ruby on rails
Introducing ruby on rails
 
Banishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPBanishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHP
 
06 debugging
06 debugging06 debugging
06 debugging
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
Desarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móvilesDesarrollo de módulos en Drupal e integración con dispositivos móviles
Desarrollo de módulos en Drupal e integración con dispositivos móviles
 
Speed Things Up with Transients
Speed Things Up with TransientsSpeed Things Up with Transients
Speed Things Up with Transients
 
mod_rewrite
mod_rewritemod_rewrite
mod_rewrite
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsJava Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom Tags
 
Scaling Databases with DBIx::Router
Scaling Databases with DBIx::RouterScaling Databases with DBIx::Router
Scaling Databases with DBIx::Router
 
Parsing with Perl6 Grammars
Parsing with Perl6 GrammarsParsing with Perl6 Grammars
Parsing with Perl6 Grammars
 
Mongo à la Resque
Mongo à la ResqueMongo à la Resque
Mongo à la Resque
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 

Kürzlich hochgeladen

Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Intelisync
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 

Kürzlich hochgeladen (20)

Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 

Haskell is Not For Production and Other Tales

  • 1. Haskell is Not For Production and Other Tales by Katie Miller (@codemiller) Software Engineer at Facebook
  • 2.
  • 3. So what do you code in?
  • 6.
  • 7.
  • 8. more than 1 million requests/second
  • 13.
  • 14. Haxl
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21. fpSpammer  ::  Haxl  Bool   fpSpammer  =        talkingAboutMonads  .&&      numFriends  .>  100  .&&      friendsLikePython      where      talkingAboutMonads  =          strContains  "monad"  <$>  postContent      friendsLikePython  =  do          friends  <-­‐  getFriends          pyFriends  <-­‐  filterM  likesPython  friends          return  (length  pyFriends  >=              length  friends  `div`  2)  
  • 23.    {-­‐#  LANGUAGE  ApplicativeDo  #-­‐}      friendsLikePython  =  do          friends  <-­‐  getFriends          pyFriends  <-­‐  filterM  likesPython  friends          return  (length  pyFriends  >=              length  friends  `div`  2)
  • 30. Source: A History of Haskell: Being Lazy With Class
  • 31.
  • 32.
  • 33. Haskell is used in industry
  • 35. AT&T Barclays Facebook Google Microsoft New York Times Standard Chartered CircuitHub Fynder Hasura Helium Pusher Scrive Wagon
  • 41. userHasAssoc  ::  Int  -­‐>  Int  -­‐>  Haxl  Bool   userHasAssoc  assoc  target  =  ...
  • 42. userHasAssoc  ::  Int  -­‐>  Int  -­‐>  Haxl  Bool   userHasAssoc  assoc  target  =  ... newtype  Id  =  Id  Int   newtype  AssocId  =  AssocId  Int
  • 43. userHasAssoc  ::  Int  -­‐>  Int  -­‐>  Haxl  Bool   userHasAssoc  assoc  target  =  ... newtype  Id  =  Id  Int   newtype  AssocId  =  AssocId  Int userHasAssoc  ::  AssocId  -­‐>  Id  -­‐>  Haxl  Bool   userHasAssoc  assoc  target  =  ...
  • 58. "FP is simple. The core ideas are simple. Abstraction can be hard. It doesn't mean it's not worth learning." - John Hughes
  • 59.
  • 60.
  • 62. vim
  • 63. dozens learnt Haxl in three days
  • 65.
  • 66.
  • 67.
  • 69. the cost of laziness
  • 79. why
  • 82.
  • 88. blockAustralians  ::  Haxl  SyncResponses   blockAustralians  =  do      textMap  <-­‐  textArr      let  text  =  HashMap.lookupDefault  ""  "main_text"  textMap              numBadWords      =  length  $  filter  (`Text.isInfixOf`  text)  aussieTerms              numBadPhrases  =  length  $  filter  (`Text.isInfixOf`  text)  aussieSayings      if  numBadWords  <  2  &&  numBadPhrases  <=  0      then  return  noResponses      else              if  numBadWords  <  4  &&  numBadPhrases  <  2              then  return  requireCaptcha              else                      if  numBadWords  <  5  &&  numBadPhrases  <  3                      then  return  $  responses  [warnUser,  requireCaptcha]                      else                              if  numBadWords  <  7  &&  numBadPhrases  <  4                              then  return  warnUser                              else                                      if  numBadWords  <  8  &&  numBadPhrases  <  5                                      then  return  $  responses  [warnUser,  blockAccess]                                      else                                              if  numBadWords  <  10  &&  numBadPhrases  <  6                                              then  return  blockAccess                                              else                                                      if  numBadWords  <  13  &&  numBadPhrases  <  7                                                      then  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ]                                                      else  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ,  requireCaptcha                                                                        ]          where              aussieTerms  =                      [  "Acca  Dacca"                      ,  "ambo"                      ,  "arvo"                      ,  "Aussie"                      ,  "bangaroo"
  • 89. blockAustralians  ::  Haxl  SyncResponses   blockAustralians  =  do      textMap  <-­‐  textArr      let  text  =  HashMap.lookupDefault  ""  "main_text"  textMap              numBadWords      =  length  $  filter  (`Text.isInfixOf`  text)  aussieTerms              numBadPhrases  =  length  $  filter  (`Text.isInfixOf`  text)  aussieSayings      if  numBadWords  <  2  &&  numBadPhrases  <=  0      then  return  noResponses      else              if  numBadWords  <  4  &&  numBadPhrases  <  2              then  return  requireCaptcha              else                      if  numBadWords  <  5  &&  numBadPhrases  <  3                      then  return  $  responses  [warnUser,  requireCaptcha]                      else                              if  numBadWords  <  7  &&  numBadPhrases  <  4                              then  return  warnUser                              else                                      if  numBadWords  <  8  &&  numBadPhrases  <  5                                      then  return  $  responses  [warnUser,  blockAccess]                                      else                                              if  numBadWords  <  10  &&  numBadPhrases  <  6                                              then  return  blockAccess                                              else                                                      if  numBadWords  <  13  &&  numBadPhrases  <  7                                                      then  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ]                                                      else  return  $  responses                                                                        [  blockAccess                                                                        ,  enrollInFakeAccountCheckpoint                                                                        ,  requireCaptcha                                                                        ]          where              aussieTerms  =                      [  "Acca  Dacca"                      ,  "ambo"                      ,  "arvo"                      ,  "Aussie"                      ,  "bangaroo"
  • 95. Haskell is different; that brings benefits and challenges
  • 96. Haskell is a tool, not utopia
  • 98. Haxl team past and present Katie Miller Bartosz Nitka Jon Purdy Aaron Roth Zejun Wu Noam Zilberstein š Louis Brandy Jonathan Coens Andrew Farmer Kubo Kovác Jake Lengyel Simon Marlow
  • 99. Image credits Story Time (Elliot Margolies, CC BY-NC-ND 2.0)
  • 100. References Ben Ford, Haskell at Fynder David Crystal, The Story of 100 English Words From Zero to HIPster (Haskell in Production) Haskell in Industry Hudak et al, A History of Haskell: Being Lazy With Class Paul Graham, Beating the Averages Philip Wadler, Propositions as Types Sarah Sharp, What Makes a Good Community? Simon Yang, My Journey into Haskell
  • 101. More about Haxl Haxl on GitHub 'Fighting spam with Haskell' blog post 'There is no Fork' ICFP paper and presentation 'The Road to Running Haskell at Facebook Scale' presentation Wired article