Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Optional Type Specification in Erlang
1. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Optional Type Specification in Erlang
Andreas Pauley – @apauley
Lambda Luminaries – @lambdaluminary
November 11, 2013
Andreas Pauley – @apauley
Types in Erlang
2. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
3. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Dynamic, but strong
example({}) ->
"empty tuple";
example(List) when is_list(List) ->
length(List);
example(_Else) ->
another_return_type.
Andreas Pauley – @apauley
Types in Erlang
4. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Dynamic, but strong
3> 5 + "6".
** exception error: an error occurred when evaluating
an arithmetic expression
in operator +/2
called as 5 + "6"
Andreas Pauley – @apauley
Types in Erlang
5. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
6. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Yes and No :-/
The Haskell giants Simon Marlow and Philip Wadler spent
over a year developing a static type system for Erlang (circa
1997).
Andreas Pauley – @apauley
Types in Erlang
7. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Yes and No :-/
The Haskell giants Simon Marlow and Philip Wadler spent
over a year developing a static type system for Erlang (circa
1997).
Only a subset of the language could be type-checked.
Andreas Pauley – @apauley
Types in Erlang
8. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Yes and No :-/
The Haskell giants Simon Marlow and Philip Wadler spent
over a year developing a static type system for Erlang (circa
1997).
Only a subset of the language could be type-checked.
Process types and inter-process messages could not be
type-checked.
Andreas Pauley – @apauley
Types in Erlang
9. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
10. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Declaring Types
We can declare union/sum types and product types:
-type suit() :: spades | clubs | hearts | diamonds.
-type value() :: 1..10 | jack | queen | king.
-type card() :: {suit(), value()}.
Andreas Pauley – @apauley
Types in Erlang
11. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Declaring Types
Types in record definitions:
-record(rsa_id_number, {birth_date
gender_digit
sequence_nr
citizen_digit
digit_a
checksum_digit
Andreas Pauley – @apauley
Types in Erlang
::
::
::
::
::
::
calendar:date(),
0..9,
0..999,
0 | 1,
0..9,
0..9}).
12. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Using Types
-spec suit(card()) -> suit().
suit({Suit, _}) -> Suit.
Andreas Pauley – @apauley
Types in Erlang
13. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Using Types
-type gender() :: male | female.
-type rsa_id_number() :: #rsa_id_number{}.
-export_type([rsa_id_number/0]).
-spec gender(rsa_id_number()) -> gender().
gender(#rsa_id_number{gender_digit=GenderDigit})
when GenderDigit >= 5 -> male;
gender(#rsa_id_number{gender_digit=GenderDigit})
when GenderDigit < 5 -> female.
Andreas Pauley – @apauley
Types in Erlang
14. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
15. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A static analysis tool developed by Kostis Sagonas from the
University of Uppsala in Sweden.
Andreas Pauley – @apauley
Types in Erlang
16. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A static analysis tool developed by Kostis Sagonas from the
University of Uppsala in Sweden.
Type inference based on Success Typing instead of
Hindley-Milner.
Andreas Pauley – @apauley
Types in Erlang
17. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A static analysis tool developed by Kostis Sagonas from the
University of Uppsala in Sweden.
Type inference based on Success Typing instead of
Hindley-Milner.
Doesn’t need type specifications, but you get more useful
results if you provide them.
Andreas Pauley – @apauley
Types in Erlang
18. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Dialyzer and Types
-type suit() :: spades | clubs | hearts | diamonds.
-type value() :: 1..10 | jack | queen | king.
-type card() :: {suit(), value()}.
Andreas Pauley – @apauley
Types in Erlang
19. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Dialyzer and Types
-spec kind(card()) -> face | number.
kind({_, A}) when A >= 1, A =< 10 -> number;
kind(_) -> face.
main() ->
number
face
number
face
=
=
=
=
kind({spades, 7}),
kind({hearts, king}),
kind({rubies, 4}),
kind({clubs, queen}).
Andreas Pauley – @apauley
Types in Erlang
20. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Dialyzer and Types
Checking whether the PLT .deps_plt is up-to-date... yes
Proceeding with analysis...
src/cards.erl:15: Function main/0 has no local return
src/cards.erl:18: The call cards:kind({’rubies’,4})
breaks the contract (card()) -> ’face’ | ’number’
done in 0m0.54s
done (warnings were emitted)
make: *** [dialyzer] Error 2
Andreas Pauley – @apauley
Types in Erlang
21. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
22. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A QuickCheck-inspired property-based testing tool for Erlang.
Andreas Pauley – @apauley
Types in Erlang
23. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A QuickCheck-inspired property-based testing tool for Erlang.
Developed by Manolis Papadakis, Eirini Arvaniti and Kostis
Sagonas from the National Technical University of Athens.
Andreas Pauley – @apauley
Types in Erlang
24. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Discrepency Analyzer for Erlang
A QuickCheck-inspired property-based testing tool for Erlang.
Developed by Manolis Papadakis, Eirini Arvaniti and Kostis
Sagonas from the National Technical University of Athens.
Has the ability to generate random tests based on type specs.
Andreas Pauley – @apauley
Types in Erlang
25. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Property tests from the specs
2> proper:check_specs(rsa_id_number).
Testing rsa_id_number:checksum/1
...........................................................
OK: Passed 100 test(s).
Testing rsa_id_number:citizen/1
...........................................................
OK: Passed 100 test(s).
Testing rsa_id_number:gender/1
...........................................................
OK: Passed 100 test(s).
Andreas Pauley – @apauley
Types in Erlang
26. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Table of Contents
1
Erlang Type Overview
2
Can we add compile-time types to Erlang?
3
Optional Types
4
Dialyzer
5
Proper
6
Conclusion
Andreas Pauley – @apauley
Types in Erlang
27. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Conclusion
On its own, type declarations is maybe just a way to comment
your code.
Andreas Pauley – @apauley
Types in Erlang
28. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Conclusion
On its own, type declarations is maybe just a way to comment
your code.
With the extra tool support and some effort we’re getting a lot
of benefit typically only found in statically typed languages.
Andreas Pauley – @apauley
Types in Erlang
29. Erlang Type Overview
Can we add compile-time types to Erlang?
Optional Types
Dialyzer
Proper
Conclusion
Conclusion
On its own, type declarations is maybe just a way to comment
your code.
With the extra tool support and some effort we’re getting a lot
of benefit typically only found in statically typed languages.
It’s far from perfect.
Andreas Pauley – @apauley
Types in Erlang