SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Simon Peyton Jones (Microsoft Research)
              Chung-Chieh Shan (Rutgers University)
Oleg Kiselyov (Fleet Numerical Meteorology and Oceanography Center)


 Tony Hoare’s 75th birthday celebration, April 2009
 “Program correctness is a basic scientific ideal
      for Computer Science”
     “The most widely used tools [in pursuit of
      correctness] concentrate on the detection of
      programming errors, widely known as bugs.
      Foremost among these [tools] are modern
      compilers for strongly typed languages”
     “Like insects that carry disease, the least
      efficient way of eradicating program bugs is by
      squashing them one by one. The only sure
      safeguard against attack is to pursue the ideal
      of not making the errors in the first place.”
“The ideal of program correctness”, Tony Hoare, BCS lecture and debate, Oct 2006
 Static typing eradicates whole species of bugs
 The static type of a function is a partial
  specification: its says something (but not too
  much) about what the function does
     reverse :: [a] -> [a]
      Increasingly precise specification
       The spectrum of confidence
              Increasing
          confidence that the
          program does what
               you want
 The static type of a function is like a weak
  specification: its says something (but not too
  much) about what the function does
     reverse :: [a] -> [a]
 Static typing is by far the most widely-used
  program verification technology in use today:
  particularly good cost/benefit ratio
   Lightweight (so programmers use them)
   Machine checked (fully automated, every compilation)
   Ubiquitous (so programmers can’t avoid them)
 Static typing eradicates whole species of bugs
    Static typing is by far the most widely-used
     program verification technology in use today:
     particularly good cost/benefit ratio


                Increasingly precise specification
                The spectrum of confidence
  Hammer                Increasing
(cheap, easy        confidence that the       Tactical nuclear weapon
    to use,                                  (expensive, needs a trained
                    program does what
   limited                                     user, but very effective
effectivenes)            you want                      indeed)
 The type system designer seeks to
 Retain the Joyful Properties of types
 While also:
   making more good programs pass the type
    checker
   making fewer bad programs pass the type
    checker
Programs that   All programs
    work
                  Programs that are
                      well typed




Make this bit
  bigger!
 The type system designer seeks to retain
  the Joyful Properties of types
 While also:
   making more good programs pass the type
    checker
   making fewer bad programs pass the type
    checker

 One such endeavour:
            Extend Haskell with
           Indexed type families
 The type system designer seeks to retain
  the Joyful Properties of types
                                 I fear that
 While also:                     Haskell is
                                 doomed to
   making more good programs pass the type
    checker                        succeed
   making fewer bad programs pass the type
    checker

 One such endeavour:                         Tony
                                              Hoare
            Extend Haskell with               (1990)

           Indexed type families
Class decl gives type
   signature of each
         method

                               class Num a where
                                 (+), (*) :: a -> a -> a
                                 negate   :: a -> a

 Instance decl gives a         square :: Num a => a -> a
  “witness” for each
                               square x = x*x
 method, matching the
      signature
                               instance   Num Int where
                                 (+)      = plusInt
                                 (*)      = mulInt
                                 negate   = negInt
plusInt :: Int -> Int -> Int
mulInt :: Int -> Int -> Int
negInt :: Int -> Int           test = square 4 + 5 :: Int
plusInt    :: Int -> Int -> Int
                    plusFloat :: Float -> Float -> Float
                    intToFloat :: Int -> Float




class GNum a b where
  (+) :: a -> b -> ???

instance GNum Int Int where
  (+) x y = plusInt x y

instance GNum Int Float where
  (+) x y = plusFloat (intToFloat x) y

test1 = (4::Int) + (5::Int)
test2 = (4::Int) + (5::Float)

                              Allowing more good
                                   programs
class GNum a b where
     (+) :: a -> b -> ???

 Result type of (+) is a function of the
  argument types                      SumTy is an
                                     associated type of
   class GNum a b where                 class GNum
     type SumTy a b :: *
     (+) :: a -> b -> SumTy a b

 Each method gets a type signature
 Each associated type gets a kind signature
class GNum a b where
    type SumTy a b :: *
    (+) :: a -> b -> SumTy a b
 Each instance declaration gives a “witness”
  for SumTy, matching the kind signature
  instance GNum Int Int where
    type SumTy Int Int = Int
    (+) x y = plusInt x y

  instance GNum Int Float where
    type SumTy Int Float = Float
    (+) x y = plusFloat (intToFloat x) y
class GNum a b where
    type SumTy a b :: *
  instance GNum Int Int where
    type SumTy Int Int = Int :: *
  instance GNum Int Float where
    type SumTy Int Float = Float

 SumTy is a type-level function
 The type checker simply rewrites
   SumTy Int Int --> Int
   SumTy Int Float --> Float
  whenever it can

 But (SumTy t1 t2) is still a perfectly good type,
  even if it can’t be rewritten. For example:
   data T a b = MkT a b (SumTy a b)
 Simply omit instances for incompatible types
  newtype Dollars = MkD Int

  instance GNum Dollars Dollars where
    type SumTy Dollars Dollars = Dollars
    (+) (MkD d1) (MkD d2) = MkD (d1+d2)

  -- No instance GNum Dollars Int

  test = (MkD 3) + (4::Int)     -- REJECTED!
 Consider a finite map, mapping keys to values
 Goal: the data representation of the map
  depends on the type of the key
   Boolean key: store two values (for F,T resp)
   Int key: use a balanced tree
   Pair key (x,y): map x to a finite map from y to
    value; ie use a trie!

 Cannot do this in Haskell...a good program
  that the type checker rejects
data Maybe a = Nothing | Just a

                             Map is indexed by k,
class Key k where            but parametric in its
  data Map k :: * -> *         second argument
  empty :: Map k v
  lookup :: k -> Map k v -> Maybe v
  ...insert, union, etc....
data Maybe a = Nothing | Just a

                             Optional value
class Key k where
                               for False
  data Map k :: * -> *
  empty :: Map k v
  lookup :: k -> Map k v -> Maybe v
  ...insert, union, etc....           Optional value
                                            for True
instance Key Bool where
  data Map Bool v = MB (Maybe v) (Maybe v)
  empty = MB Nothing Nothing
  lookup True (MB _ mt) = mt
  lookup False (MB mf _) = mf
data Maybe a = Nothing | Just a

class Key k where
                                      Two-level
  data Map k :: * -> *
                                        map
  empty :: Map k v
  lookup :: k -> Map k v -> Maybe v               Two-level
  ...insert, union, etc....                        lookup

instance (Key a, Key b) => Key (a,b) where
  data Map (a,b) v = MP (Map a (Map b v))
  empty = MP empty
  lookup (ka,kb) (MP m) = case lookup ka m of
                            Nothing -> Nothing
                            Just m2 -> lookup kb m2

 See paper for lists as keys: arbitrary depth tries
 Goal: the data representation of the map
  depends on the type of the key
   Boolean key: SUM
   Pair key (x,y): PRODUCT
   List key [x]: SUM of PRODUCT + RECURSION

 Easy to extend to other types at will
Client               Server

 addServer :: In Int (In Int (Out Int End))
  addClient :: Out Int (Out Int (In Int End))
 Type of the process expresses its protocol
 Client and server should have dual protocols:
     run addServer addClient          -- OK!
     run addServer addServer          -- BAD!
Client              Server

 addServer :: In Int (In Int (Out Int End))
  addClient :: Out Int (Out Int (In Int End))

   data In v p = In (v -> p)
   data Out v p = Out v p
   data End     = End


          NB punning
data In v p = In (v -> p)
 data Out v p = Out v p
 data End     = End



addServer :: In Int (In Int (Out Int End))
addServer = In (x -> In (y ->
            Out (x + y) End))


 Nothing fancy here
 addClient is similar
run :: ??? -> ??? -> End

       A process      A co-process


class Process p where
  type Co p
  run :: p -> Co p -> End

 Same deal as before: Co is a type-level
  function that transforms a process type into
  its dual
class Process p where       data In v p = In (v -> p)
  type Co p                 data Out v p = Out v p
  run :: p -> Co p -> End   data End     = End


instance Process p => Process (In v p) where
  type Co (In v p) = Out v (Co p)
  run (In vp) (Out v p) = run (vp v) p

instance Process p => Process (Out v p) where
  type Co (Out v p) = In v (Co p)
  run (Out v p) (In vp) = run p (vp v)


             Just the obvious thing really
 The hoary printf chestnut
  printf “Name:%s, Age:%i” :: String -> Int -> String
    Can’t do that, but we can do this:
   printf (lit “Name:” <> string <> lit “, Age:” <> int)
     :: String -> Int -> String

 Machine address computation
  add :: Pointer n -> Offset m -> Pointer (GCD n m)
 Tracking state using Hoare triples
 acquire :: (Get n p ~ Unlocked)
         => Lock n -> M p (Set n p Locked) ()


       Lock-state before                  Lock-state after
   Types have made a huge contribution
     Theorem provers
                                     to this ideal
   Powerful, but
   • Substantial manual             More sophisticated type systems
     assistance required             threaten both Happy Properties:
   • PhD absolutely essential
     (100s of daily users)           1.   Automation is harder
                                     2.   The types are more complicated
                                          (MSc required)
                                    Some complications (2) are exactly
Today’s                              due to ad-hoc restrictions to ensure
experiment                           full automation
                                    At some point it may be best to say
       Type systems
                                     “enough fooling around: just use Coq”.
  Weak, but
  • Automatically checked            But we aren’t there yet
  • No PhD required                 Haskell is a great place to play this
    (1000,000s of daily users)       game

Más contenido relacionado

La actualidad más candente

Real World Haskell: Lecture 5
Real World Haskell: Lecture 5Real World Haskell: Lecture 5
Real World Haskell: Lecture 5
Bryan O'Sullivan
 
Real World Haskell: Lecture 3
Real World Haskell: Lecture 3Real World Haskell: Lecture 3
Real World Haskell: Lecture 3
Bryan O'Sullivan
 
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
stasimus
 
Real World Haskell: Lecture 6
Real World Haskell: Lecture 6Real World Haskell: Lecture 6
Real World Haskell: Lecture 6
Bryan O'Sullivan
 
Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)
stasimus
 
C# Language Overview Part I
C# Language Overview Part IC# Language Overview Part I
C# Language Overview Part I
Doncho Minkov
 

La actualidad más candente (19)

3 kotlin vs. java- what kotlin has that java does not
3  kotlin vs. java- what kotlin has that java does not3  kotlin vs. java- what kotlin has that java does not
3 kotlin vs. java- what kotlin has that java does not
 
Real World Haskell: Lecture 5
Real World Haskell: Lecture 5Real World Haskell: Lecture 5
Real World Haskell: Lecture 5
 
Lezione03
Lezione03Lezione03
Lezione03
 
Type Classes in Scala and Haskell
Type Classes in Scala and HaskellType Classes in Scala and Haskell
Type Classes in Scala and Haskell
 
Ruby Programming Assignment Help
Ruby Programming Assignment HelpRuby Programming Assignment Help
Ruby Programming Assignment Help
 
Real World Haskell: Lecture 3
Real World Haskell: Lecture 3Real World Haskell: Lecture 3
Real World Haskell: Lecture 3
 
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
 
Monoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and CatsMonoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and Cats
 
Real World Haskell: Lecture 6
Real World Haskell: Lecture 6Real World Haskell: Lecture 6
Real World Haskell: Lecture 6
 
C# programming
C# programming C# programming
C# programming
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
 
An introduction to scala
An introduction to scalaAn introduction to scala
An introduction to scala
 
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
Quicksort - a whistle-stop tour of the algorithm in five languages and four p...
 
Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)Introduction to Monads in Scala (2)
Introduction to Monads in Scala (2)
 
C# Language Overview Part I
C# Language Overview Part IC# Language Overview Part I
C# Language Overview Part I
 
Scala Paradigms
Scala ParadigmsScala Paradigms
Scala Paradigms
 
Chapter 5
Chapter 5Chapter 5
Chapter 5
 
Abstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generatorsAbstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generators
 
Core C#
Core C#Core C#
Core C#
 

Destacado

オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
Preferred Networks
 
tensor-decomposition
tensor-decompositiontensor-decomposition
tensor-decomposition
Kenta Oono
 
Jubatusにおける大規模分散オンライン機械学習
Jubatusにおける大規模分散オンライン機械学習Jubatusにおける大規模分散オンライン機械学習
Jubatusにおける大規模分散オンライン機械学習
Preferred Networks
 

Destacado (20)

Beyond Mere Actors
Beyond Mere ActorsBeyond Mere Actors
Beyond Mere Actors
 
Compositional I/O Stream in Scala
Compositional I/O Stream in ScalaCompositional I/O Stream in Scala
Compositional I/O Stream in Scala
 
Reasonable RPC with Remotely
Reasonable RPC with RemotelyReasonable RPC with Remotely
Reasonable RPC with Remotely
 
Purely Functional I/O
Purely Functional I/OPurely Functional I/O
Purely Functional I/O
 
Peyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_futurePeyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_future
 
MongoDB as Search Engine Repository @ MongoTokyo2011
MongoDB as Search Engine Repository @ MongoTokyo2011MongoDB as Search Engine Repository @ MongoTokyo2011
MongoDB as Search Engine Repository @ MongoTokyo2011
 
jubatus pressrelease
jubatus pressreleasejubatus pressrelease
jubatus pressrelease
 
Succinct Data Structure for Analyzing Document Collection
Succinct Data Structure for Analyzing Document CollectionSuccinct Data Structure for Analyzing Document Collection
Succinct Data Structure for Analyzing Document Collection
 
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
オンライン凸最適化と線形識別モデル学習の最前線_IBIS2011
 
rcast_20140411
rcast_20140411rcast_20140411
rcast_20140411
 
Herd
HerdHerd
Herd
 
LCCC2010:Learning on Cores, Clusters and Cloudsの解説
LCCC2010:Learning on Cores,  Clusters and Cloudsの解説LCCC2010:Learning on Cores,  Clusters and Cloudsの解説
LCCC2010:Learning on Cores, Clusters and Cloudsの解説
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
tensor-decomposition
tensor-decompositiontensor-decomposition
tensor-decomposition
 
Jubatusにおける大規模分散オンライン機械学習
Jubatusにおける大規模分散オンライン機械学習Jubatusにおける大規模分散オンライン機械学習
Jubatusにおける大規模分散オンライン機械学習
 
bigdata2012ml okanohara
bigdata2012ml okanoharabigdata2012ml okanohara
bigdata2012ml okanohara
 
MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習MapReduceによる大規模データを利用した機械学習
MapReduceによる大規模データを利用した機械学習
 
大規模データ時代に求められる自然言語処理
大規模データ時代に求められる自然言語処理大規模データ時代に求められる自然言語処理
大規模データ時代に求められる自然言語処理
 
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
文法圧縮入門:超高速テキスト処理のためのデータ圧縮(NLP2014チュートリアル)
 
bigdata2012nlp okanohara
bigdata2012nlp okanoharabigdata2012nlp okanohara
bigdata2012nlp okanohara
 

Similar a Peyton jones-2009-fun with-type_functions-slide

Pharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source SmalltalkPharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source Smalltalk
Serge Stinckwich
 

Similar a Peyton jones-2009-fun with-type_functions-slide (20)

types, types, types
types, types, typestypes, types, types
types, types, types
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
Functional programming ii
Functional programming iiFunctional programming ii
Functional programming ii
 
Functional programming in kotlin with Arrow [Sunnytech 2018]
Functional programming in kotlin with Arrow [Sunnytech 2018]Functional programming in kotlin with Arrow [Sunnytech 2018]
Functional programming in kotlin with Arrow [Sunnytech 2018]
 
Pharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source SmalltalkPharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source Smalltalk
 
Functional programming with FSharp
Functional programming with FSharpFunctional programming with FSharp
Functional programming with FSharp
 
Intro to Python
Intro to PythonIntro to Python
Intro to Python
 
Advanced Web Technology ass.pdf
Advanced Web Technology ass.pdfAdvanced Web Technology ass.pdf
Advanced Web Technology ass.pdf
 
Loops in Python
Loops in PythonLoops in Python
Loops in Python
 
MODULE. .pptx
MODULE.                              .pptxMODULE.                              .pptx
MODULE. .pptx
 
ATS Programming
ATS ProgrammingATS Programming
ATS Programming
 
Google Go For Ruby Hackers
Google Go For Ruby HackersGoogle Go For Ruby Hackers
Google Go For Ruby Hackers
 
PYTHON
PYTHONPYTHON
PYTHON
 
MTL Versus Free
MTL Versus FreeMTL Versus Free
MTL Versus Free
 
Tip Top Typing - A Look at Python Typing
Tip Top Typing - A Look at Python TypingTip Top Typing - A Look at Python Typing
Tip Top Typing - A Look at Python Typing
 
Demystifying Type Class derivation with Shapeless
Demystifying Type Class derivation with ShapelessDemystifying Type Class derivation with Shapeless
Demystifying Type Class derivation with Shapeless
 
Why Haskell Matters
Why Haskell MattersWhy Haskell Matters
Why Haskell Matters
 
Python basics
Python basicsPython basics
Python basics
 
Functions and pointers_unit_4
Functions and pointers_unit_4Functions and pointers_unit_4
Functions and pointers_unit_4
 
Python Scipy Numpy
Python Scipy NumpyPython Scipy Numpy
Python Scipy Numpy
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 

Peyton jones-2009-fun with-type_functions-slide

  • 1. Simon Peyton Jones (Microsoft Research) Chung-Chieh Shan (Rutgers University) Oleg Kiselyov (Fleet Numerical Meteorology and Oceanography Center) Tony Hoare’s 75th birthday celebration, April 2009
  • 2.  “Program correctness is a basic scientific ideal for Computer Science”  “The most widely used tools [in pursuit of correctness] concentrate on the detection of programming errors, widely known as bugs. Foremost among these [tools] are modern compilers for strongly typed languages”  “Like insects that carry disease, the least efficient way of eradicating program bugs is by squashing them one by one. The only sure safeguard against attack is to pursue the ideal of not making the errors in the first place.” “The ideal of program correctness”, Tony Hoare, BCS lecture and debate, Oct 2006
  • 3.  Static typing eradicates whole species of bugs  The static type of a function is a partial specification: its says something (but not too much) about what the function does reverse :: [a] -> [a] Increasingly precise specification The spectrum of confidence Increasing confidence that the program does what you want
  • 4.  The static type of a function is like a weak specification: its says something (but not too much) about what the function does reverse :: [a] -> [a]  Static typing is by far the most widely-used program verification technology in use today: particularly good cost/benefit ratio  Lightweight (so programmers use them)  Machine checked (fully automated, every compilation)  Ubiquitous (so programmers can’t avoid them)
  • 5.  Static typing eradicates whole species of bugs  Static typing is by far the most widely-used program verification technology in use today: particularly good cost/benefit ratio Increasingly precise specification The spectrum of confidence Hammer Increasing (cheap, easy confidence that the Tactical nuclear weapon to use, (expensive, needs a trained program does what limited user, but very effective effectivenes) you want indeed)
  • 6.  The type system designer seeks to  Retain the Joyful Properties of types  While also:  making more good programs pass the type checker  making fewer bad programs pass the type checker
  • 7. Programs that All programs work Programs that are well typed Make this bit bigger!
  • 8.  The type system designer seeks to retain the Joyful Properties of types  While also:  making more good programs pass the type checker  making fewer bad programs pass the type checker  One such endeavour: Extend Haskell with Indexed type families
  • 9.  The type system designer seeks to retain the Joyful Properties of types I fear that  While also: Haskell is doomed to  making more good programs pass the type checker succeed  making fewer bad programs pass the type checker  One such endeavour: Tony Hoare Extend Haskell with (1990) Indexed type families
  • 10. Class decl gives type signature of each method class Num a where (+), (*) :: a -> a -> a negate :: a -> a Instance decl gives a square :: Num a => a -> a “witness” for each square x = x*x method, matching the signature instance Num Int where (+) = plusInt (*) = mulInt negate = negInt plusInt :: Int -> Int -> Int mulInt :: Int -> Int -> Int negInt :: Int -> Int test = square 4 + 5 :: Int
  • 11. plusInt :: Int -> Int -> Int plusFloat :: Float -> Float -> Float intToFloat :: Int -> Float class GNum a b where (+) :: a -> b -> ??? instance GNum Int Int where (+) x y = plusInt x y instance GNum Int Float where (+) x y = plusFloat (intToFloat x) y test1 = (4::Int) + (5::Int) test2 = (4::Int) + (5::Float) Allowing more good programs
  • 12. class GNum a b where (+) :: a -> b -> ???  Result type of (+) is a function of the argument types SumTy is an associated type of class GNum a b where class GNum type SumTy a b :: * (+) :: a -> b -> SumTy a b  Each method gets a type signature  Each associated type gets a kind signature
  • 13. class GNum a b where type SumTy a b :: * (+) :: a -> b -> SumTy a b  Each instance declaration gives a “witness” for SumTy, matching the kind signature instance GNum Int Int where type SumTy Int Int = Int (+) x y = plusInt x y instance GNum Int Float where type SumTy Int Float = Float (+) x y = plusFloat (intToFloat x) y
  • 14. class GNum a b where type SumTy a b :: * instance GNum Int Int where type SumTy Int Int = Int :: * instance GNum Int Float where type SumTy Int Float = Float  SumTy is a type-level function  The type checker simply rewrites  SumTy Int Int --> Int  SumTy Int Float --> Float whenever it can  But (SumTy t1 t2) is still a perfectly good type, even if it can’t be rewritten. For example: data T a b = MkT a b (SumTy a b)
  • 15.  Simply omit instances for incompatible types newtype Dollars = MkD Int instance GNum Dollars Dollars where type SumTy Dollars Dollars = Dollars (+) (MkD d1) (MkD d2) = MkD (d1+d2) -- No instance GNum Dollars Int test = (MkD 3) + (4::Int) -- REJECTED!
  • 16.  Consider a finite map, mapping keys to values  Goal: the data representation of the map depends on the type of the key  Boolean key: store two values (for F,T resp)  Int key: use a balanced tree  Pair key (x,y): map x to a finite map from y to value; ie use a trie!  Cannot do this in Haskell...a good program that the type checker rejects
  • 17. data Maybe a = Nothing | Just a Map is indexed by k, class Key k where but parametric in its data Map k :: * -> * second argument empty :: Map k v lookup :: k -> Map k v -> Maybe v ...insert, union, etc....
  • 18. data Maybe a = Nothing | Just a Optional value class Key k where for False data Map k :: * -> * empty :: Map k v lookup :: k -> Map k v -> Maybe v ...insert, union, etc.... Optional value for True instance Key Bool where data Map Bool v = MB (Maybe v) (Maybe v) empty = MB Nothing Nothing lookup True (MB _ mt) = mt lookup False (MB mf _) = mf
  • 19. data Maybe a = Nothing | Just a class Key k where Two-level data Map k :: * -> * map empty :: Map k v lookup :: k -> Map k v -> Maybe v Two-level ...insert, union, etc.... lookup instance (Key a, Key b) => Key (a,b) where data Map (a,b) v = MP (Map a (Map b v)) empty = MP empty lookup (ka,kb) (MP m) = case lookup ka m of Nothing -> Nothing Just m2 -> lookup kb m2 See paper for lists as keys: arbitrary depth tries
  • 20.  Goal: the data representation of the map depends on the type of the key  Boolean key: SUM  Pair key (x,y): PRODUCT  List key [x]: SUM of PRODUCT + RECURSION  Easy to extend to other types at will
  • 21. Client Server  addServer :: In Int (In Int (Out Int End)) addClient :: Out Int (Out Int (In Int End))  Type of the process expresses its protocol  Client and server should have dual protocols: run addServer addClient -- OK! run addServer addServer -- BAD!
  • 22. Client Server  addServer :: In Int (In Int (Out Int End)) addClient :: Out Int (Out Int (In Int End)) data In v p = In (v -> p) data Out v p = Out v p data End = End NB punning
  • 23. data In v p = In (v -> p) data Out v p = Out v p data End = End addServer :: In Int (In Int (Out Int End)) addServer = In (x -> In (y -> Out (x + y) End))  Nothing fancy here  addClient is similar
  • 24. run :: ??? -> ??? -> End A process A co-process class Process p where type Co p run :: p -> Co p -> End  Same deal as before: Co is a type-level function that transforms a process type into its dual
  • 25. class Process p where data In v p = In (v -> p) type Co p data Out v p = Out v p run :: p -> Co p -> End data End = End instance Process p => Process (In v p) where type Co (In v p) = Out v (Co p) run (In vp) (Out v p) = run (vp v) p instance Process p => Process (Out v p) where type Co (Out v p) = In v (Co p) run (Out v p) (In vp) = run p (vp v) Just the obvious thing really
  • 26.  The hoary printf chestnut printf “Name:%s, Age:%i” :: String -> Int -> String  Can’t do that, but we can do this: printf (lit “Name:” <> string <> lit “, Age:” <> int) :: String -> Int -> String  Machine address computation add :: Pointer n -> Offset m -> Pointer (GCD n m)  Tracking state using Hoare triples acquire :: (Get n p ~ Unlocked) => Lock n -> M p (Set n p Locked) () Lock-state before Lock-state after
  • 27. Types have made a huge contribution Theorem provers to this ideal Powerful, but • Substantial manual  More sophisticated type systems assistance required threaten both Happy Properties: • PhD absolutely essential (100s of daily users) 1. Automation is harder 2. The types are more complicated (MSc required)  Some complications (2) are exactly Today’s due to ad-hoc restrictions to ensure experiment full automation  At some point it may be best to say Type systems “enough fooling around: just use Coq”. Weak, but • Automatically checked But we aren’t there yet • No PhD required  Haskell is a great place to play this (1000,000s of daily users) game