📖Do be do be do

Sam Lindley AND Conor McBride AND Craig McLaughlin
  • based on Plotkin and Power’s algebraic effects
    • and Plotkin and Pretnar’s handlers for algebraic effects
  • operators generalize functions and effects
    • pure function is an operator with no effects
  • what bidirectional effect type system means?
  • what is effect polymorphism?
  • works in strict language (but with possibly delayed computations)
    • “The absence of explicit plumbing in Frank depends crucially on the fact that Frank, unlike Haskell, has a fixed evaluation order.”
  • handling effects is just a function
    state : S -> <State S>X -> X
    state _ x            = x                 -- this catch-all does not include effects---only values
    state s <get -> k>   = state s (k s)
    state _ <put s -> k> = state s (k unit)
  • handling multiple effects
    pipe : <Send X>Unit -> <Receive X>Y -> [Abort]Y
    pipe <send x -> s> <receive -> r> = pipe (s unit) (r x)
    pipe <_>           y              = y
    pipe unit          <_>            = abort!