SlideShare a Scribd company logo
1 of 103
Download to read offline
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

More Related Content

What's hot

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
 

What's hot (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
 

Viewers also liked

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년도 원광대학교 컴퓨터공학과 소개자료창여 김창여
 

Viewers also liked (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년도 원광대학교 컴퓨터공학과 소개자료
 

Similar to 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
 

Similar to 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
 

Recently uploaded

%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburgmasabamasaba
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 

Recently uploaded (20)

%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
Abortion Pill Prices Boksburg [(+27832195400*)] 🏥 Women's Abortion Clinic in ...
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 

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