Types ⇔ Design

Tikhon Jelvis

What is code design?

essence-of-software.jpg

code-design.svg

code-design-concepts.svg

code-design-feedback.svg

“Programming is planning.”

Programming is design.

code-design-point-code.svg

code-design-point-concepts.svg

code-design-distance.svg

rsync-delete-files.png

rsync -r --delete ~/path/a ~/path/b

rsync -r --delete ~/path/a ~/path/b

rsync -r --delete ~/path/a ~/path/b

rsync -r * ~/out
rsync -r ~/path/a ~/path/b

delete-file-directory-listing.png

frustrated.svg

What are types for?

barrier.svg

“Types catch mistakes”

code-design-point-code.svg

scaffolding.svg

“Types structure my code”

code-design-point-code-distance.svg

blueprint.svg

“Types help me think”

code-design-types-concepts-feedback.svg

Information hiding:

abstract over implementation

::

Static types:

abstract over runtime

abstract-interpretation-traces.svg

abstract-interpretation-approximation.svg

a different sort of abstraction

encode :: Image RGB -> ByteString
encode = _

encode :: Image RGB -> ByteString
encode = _
colorSpace :: Image RGB -> Image YCbCr
colorSpace = _
downsample :: Image YCbCr 
           -> Downsampled
downsample = _
blocks :: Downsampled 
       -> [Downsampled]
blocks = _

data Image space = Image
  { pixels :: Vector space }

data Downsampled = Downsampled
  { y  :: Vector Word8
  , cb :: Vector Word8
  , cr :: Vector Word8
  }

foundations-of-rl.jpg

mdp-definition.jpg

mp-definition.jpg

mrp-definition.jpg

data MarkovProcess m s = MP {
  step :: s -> m s
}

data MarkovRewardProcess m s = MRP {
  step :: s -> m (r, s)
}

data MDP m a s = MDP {
  step :: s -> a -> m (r, s)
}

type Policy s a = s -> a

data MarkovProcess m s = MP {
  step :: s -> m s
}

type MarkovRewardProcess m s =
  MarkovProcess (WriterT Reward m) s

data MDP m a s = MDP {
  step :: s -> a -> m s
}

apply :: MDP m a s 
      -> Policy s a 
      -> MarkovProcess m s

         
data MDP m a s = MDP {
  step :: s -> a -> m s
}

           
data MDP m a s = MDP {
  step :: s -> a -> m s
}

             
data MDP m a s = MDP {
  step :: s -> a -> m s
}

So, what did static typing get us?

simplify our conceptual model

feedback before we had runnable code

interactive support as we program

high-level guide to our conceptual model

Where does this take us?

Type-Driven Development

Concepts ⇒ Types ⇒ Code

how-statically-typed-programmers-write-code.png

Domain Driven Design?

domain-driven-design-made-functional.jpg

Dependent Types?

type-driven-development-with-idris.jpg

LLM Code Generation

Today: boilerplate, bad code, no design, no verification

Tomorrow: better tools, good design, verification?

Our tools should help us think

Created by Tikhon Jelvis.