Erlang Meets Dependent Types

Erlang Meets Dependent Types

Talk given at EdLambda, in July 2015.

Dissertation Link: http://lenary.co.uk/publications/dissertation/

334a587ef1901e2d48dfd15f90522496?s=128

Sam Elliott

July 14, 2015
Tweet

Transcript

  1. 2.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Erlang • Actor-based

    Concurrent Programming Language • !, receive, and spawn • Mailbox per Isolated Process Sam Elliott Erlang Meets Dependent Types
  2. 3.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Erlang Advanced Features

    • Dynamically Typed • dialyzer • OTP: Behaviours Sam Elliott Erlang Meets Dependent Types
  3. 4.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Dependently-Typed Languages •

    Idris • Agda • Coq Sam Elliott Erlang Meets Dependent Types
  4. 5.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Idris • Dependently-typed

    Pure Programming Language • Types are Values • Values are Types • Programs and Proofs Sam Elliott Erlang Meets Dependent Types
  5. 6.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Idris IRs “Cross-platform

    Compilers for Functional Languages” • Idris • TT • TTcase • IRcase • IRlift • IRdefunc • IRANF • Idris Bytecode Sam Elliott Erlang Meets Dependent Types
  6. 8.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Actors data Actor

    : Type → Type → Type proc : Actor l () Sam Elliott Erlang Meets Dependent Types
  7. 9.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Actors data Actor

    : Type → Type → Type proc : Actor l () recieve : Actor l l Sam Elliott Erlang Meets Dependent Types
  8. 10.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Actors data Actor

    : Type → Type → Type proc : Actor l () recieve : Actor l l spawn : (Actor l’ a) → Actor l (ActorID l’) data ActorID : Type → Type pid : ActorID l Sam Elliott Erlang Meets Dependent Types
  9. 11.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Actors data Actor

    : Type → Type → Type proc : Actor l () recieve : Actor l l spawn : (Actor l’ a) → Actor l (ActorID l’) data ActorID : Type → Type pid : ActorID l send : ActorID l’ → l’ → Actor l () Sam Elliott Erlang Meets Dependent Types
  10. 12.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC data RPCLang

    : (r : Type) → (r → Type) → Type Sam Elliott Erlang Meets Dependent Types
  11. 13.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC data RPCLang

    : (r : Type) → (r → Type) → Type data LockReq = Lock | Unlock data LockLockResp = Grant | Wait total LockResp : LockReq → Type LockResp Lock = LockLockResp LockResp Unlock = Unit LockLang : RPCLang LockReq LockResp Sam Elliott Erlang Meets Dependent Types
  12. 14.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC II data

    RPCRef : RPCLang rq rs → Type rpc : {l : RPCLang rq rs} → RPCRef l → (m : rq) → EIO (rs m) Sam Elliott Erlang Meets Dependent Types
  13. 15.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC II data

    RPCRef : RPCLang rq rs → Type rpc : {l : RPCLang rq rs} → RPCRef l → (m : rq) → EIO (rs m) pid : RPCRef LockLang rpc pid Lock : LockLockResp rpc pid Unlock : Unit Sam Elliott Erlang Meets Dependent Types
  14. 16.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC III spawn

    : {l : RPCLang rq rs} → (r : rq → rs r) → EIO (RPCRef l) Sam Elliott Erlang Meets Dependent Types
  15. 17.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC III spawn

    : {l : RPCLang rq rs} → (r : rq → rs r) → EIO (RPCRef l) total lock : (m : LockReq) → LockResp m lock Lock = Grant -- Oh Crap! lock Unlock = () Sam Elliott Erlang Meets Dependent Types
  16. 18.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion RPC III spawn

    : {l : RPCLang rq rs} → (r : rq → rs r) → EIO (RPCRef l) total lock : (m : LockReq) → LockResp m lock Lock = Grant -- Oh Crap! lock Unlock = () State? Side Effects? Sam Elliott Erlang Meets Dependent Types
  17. 19.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion OTP • “Open

    Telecoms Platform” • Lots of great defaults • Generic Behaviours! • Supervisors! Sam Elliott Erlang Meets Dependent Types
  18. 20.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Generic Behaviours •

    gen server • gen fsm • gen event Sam Elliott Erlang Meets Dependent Types
  19. 21.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion gen server data

    GSL : (cl : Type) → (cl → Type) → Type → Type data GSRef : GSL cl cr ct → Type Sam Elliott Erlang Meets Dependent Types
  20. 22.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion gen server data

    GSL : (cl : Type) → (cl → Type) → Type → Type data GSRef : GSL cl cr ct → Type call : {l : GSL cl cr ct} → GSRef l → (m : cl) → EIO (cr m) cast : {l : GSL cl cr ct} → GSRef l → ct → EIO Unit Sam Elliott Erlang Meets Dependent Types
  21. 23.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion gen server data

    GS : (GSL cl cr ct) → Type → Type → Type spawn : (GS l st i) → i → EIO (GSRef i) Sam Elliott Erlang Meets Dependent Types
  22. 24.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Conclusion • We

    can produce verified concurrent programs in Idris • We can compile these programs to work with Erlang • We can run verified programs in Erlang Sam Elliott Erlang Meets Dependent Types
  23. 26.

    Erlang Dependent Types Compiler Concurrency OTP Conclusion Thanks To Edwin

    Brady Rob Stewart Skyscanner & Mike Moran Sam Elliott Erlang Meets Dependent Types