Types and Perl
Language
hiratara
FreakOut Inc.
Sep. 20, 2013 / YAPC::Asia Tokyo
hiratara Types and Perl Language
What are “types”?
A thing which determines if a
term belong to some class.
1
my $x = "ABC"; $x + 3
sub id { @_ } id(10)
my...
What are “types”?
Typeable:
1
sub id { @_ } id(10)
Not typeable:
my $x = "ABC"; $x + 3
my $f = 0; $f->("X")
hiratara Types...
What are “types”?
It’s important whether a term is
typeable or not.
It isn’t important what type a term
has.
hiratara Type...
What is “typeable”?
Is this perl code typeable?
sub add1 {
my $n = $_[0];
return $n + 1;
}
hiratara Types and Perl Language
What is “typeable”?
Or, is this C code typeable?
int add1 (int n) {
return n + 1;
}
hiratara Types and Perl Language
Considered as the same
sub add1 {
my $n = $_[0];
return $n + 1;
}
int add1 (int n) {
return n + 1;
}
hiratara Types and Pe...
Considered as the same
Perl and C versions of add1 will
be evaluated in the same way. So
the Perl code are as safe as the
...
λ calculus
A model of computation
Just a string of symbols
Don’t think what it means
hiratara Types and Perl Language
λ calculus
sub add1 {
my $n = $_[0];
return $n + 1;
}
λn.n + 1
hiratara Types and Perl Language
λ terms
That’s all.
abstraction λn. ...
application fx
hiratara Types and Perl Language
β reduction
(λv.s)t
β
−→ [t → v]s
Example
(λxy.yx)z(λx.x)
β
−→ (λy.yz)(λx.x)
β
−→ (λx.x)z
β
−→ z
hiratara Types and Perl L...
Typed λ calculus
Evaluetion is the same with λ
calculus
Give lambda terms typing
rules
Typed terms will be
evaluated corre...
Typing rules
x: T ∈ Γ
Γ x: T
Γ, x: T1 t2 : T2
Γ λx: T1.t2 : T1 → T2
Γ t1 : T11 → T12 Γ t2 : T11
Γ t1t2 : T12
hiratara Type...
example of Typing
x: Int ∈ x: Int, y: Int
x: Int, y: Int x: Int
y: Int ∈ x: Int, y: Int
x: Int, y: Int y: Int
x: Int, y: I...
How to infer types
....
(λx.x)1: ?
break a problem into 2 parts
building equations, and
solving it.
hiratara Types and Per...
Building equations
x: T ∈ Γ
Γ x: T|{}
Γ, x: T1 t2 : T2|C
Γ λx: T1.t2 : T1 → T2|C
Γ t1 : X|C1 Γ t2 : T11|C2
Γ t1t2 : T12|C1...
Building equations
We can build equations
recursively.
x: T1 ∈ x: T1
x: T1 x: T1|{}
λx: T1.x: T1 → T1|{} 1: Int|{}
(λx: T1...
Solving equations
Compare constructors
{X → Y = (Int → Y ) → Y,
X = Y → Y }
hiratara Types and Perl Language
Solving equations
X was Int → Y , then, remove X
by substitution
{X = Int → Y , Y = Y,
X = Y → Y }
hiratara Types and Perl...
Solving equations
Remove an equation satisfied
X = Int → Y
{Y = Y , Int → Y = Y → Y }
hiratara Types and Perl Language
Solving equations
X = Int → Y
{Int → Y = Y → Y }
hiratara Types and Perl Language
Solving equations
X = Int → Y
{Int = Y, Y = Y }
hiratara Types and Perl Language
Solving equations
X = Int → Int, Y = Int
{Int = Int}
hiratara Types and Perl Language
Solving equations
All equetions are satisfied :)
X = Int → Int, Y = Int
{}
hiratara Types and Perl Language
Infer perl types
Infer the type of
sub { $_[0] + 1 }
The answer is
sub { $_[0] : Int + 1 }
: Int -> Int
hiratara Types and...
Various types
Polymorphic Type
Record Type
Subtype
Recursive Type
hiratara Types and Perl Language
Polymorphic Type
Simple typing doesn’t work well
with following terms.
my $id = sub { $_[0] };
$id->("YAPC");
$id->(2013);...
Universal quantifier
x: T ∈ T, x: T
T, x: T x: T
T λx: T.x: T → T
λT.λx: T.x: ∀T.T → T
(λT.λx: T.x)Int: Int → Int 1: Int
(λ...
Let-bound polymorphism
Change the let rule from
Γ t1 : T1 Γ, $x: T1 t2 : T2
Γ my $x =t1; t2 : T2
to
Γ t1 : T1 Γ [$x → t1]t...
Let-bound polymorphism
More practically, ∀ appears only
in the type environment.
Γ, X1, . . . , Xn t1 : T1 Γ, $x: ∀X1 . . ...
Record type
Record type is the type for
structures.
{age => 26, name => "Perl"}
: {age: Int, name: String}
hiratara Types ...
Subtyping
{l1 : T1, . . . , lk : Tk, . . . , ln : Tn} <:
{l1 : T1, . . . , lk : Tk}
Si <: Ti
{l1 : S1, . . . , ln : Sn}
<:...
Subtyping
covariant and contravariant
T1 <: S1 S2 <: T2
S1 → S2 <: T1 → T2
For example,
sub { { x => $_[0]->{x} + $_[0]->{...
Infer subtyping
Subtyping relations are not
equivalence relation but ordering
relation.
It’s non-deterministic to solve
in...
row variables
α ⊕ {l1 : T1, . . . , ln : Tn}
hiratara Types and Perl Language
row variables
if we have
β ⊕ {l3 : Bool} = α ⊕ {l1 : Int, l2 : Str}
α ⊕ {l1 : Int, l2 : Str} = {l1 : Int, l2 : Str, l3 : B...
variable arguments
We consider variable arguments
as a record type.
my $plus10 = sub { $_[0] + 10 };
$plus10->(5);
$plus10...
variable arguments
The type of 0, "Dummy" is
{0: Int, 1: Str}, and
$plus10: ∀α.α ⊕ {0: Int} → Int
So α is {1: Str}
hiratar...
Object
Object consists of 2 record types
The record type of fields, and
The record type of methods
hiratara Types and Perl ...
Object
package Language;
sub hello {
my $msg = "I’m " .
$_[0]->{name} .
", Hello.";
print($msg)
}
package main;
my $perl =...
Object
An instance of Language will
have this subroutine as methods
&Language::hello:
∀αβγ.α ⊕ {0: (β ⊕ {name: Str}, γ)}
→...
Object
$perl:
∀αβγ. (
{name: Str, age: Int},
{hello:
α ⊕ {0: (β ⊕ {name: Str}, γ)}
→ Unit}
)
hiratara Types and Perl Langu...
Invoke methods
$perl->hello() means
Reffer the type of the hello
field
Pass $perl as the first
argument
hiratara Types and P...
Invoke methods
We must solve the following
equation to infer this type.
γ = {hello: α ⊕ {0: (β ⊕ {name: Str}, γ)} → Unit}
...
Recursive type
The fixed point of types. We
introduce the operator µ .
µX.T = [µX.T → X]T
hiratara Types and Perl Language
Recursive types
$perl:
(
{name: Str, age: Int},
µγ.{hello: {0: ({name: Str, age: Int}, γ)}
→ Unit}
}
)
hiratara Types and ...
infer recursive types
I wonder if this algorithm is
correct, but it works for me.
X = µX.T if X = T and
X ∈ FV (T)
[µX.T1 ...
future work
Subtype
Variant type
Meaningful errors
Support Hashes and Arrays
Use external Parser
hiratara Types and Perl L...
Upcoming SlideShare
Loading in...5
×

Types and perl language

1,430

Published on

Talk about TypedPerl which is a type checker of perl.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,430
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Types and perl language

  1. 1. Types and Perl Language hiratara FreakOut Inc. Sep. 20, 2013 / YAPC::Asia Tokyo hiratara Types and Perl Language
  2. 2. What are “types”? A thing which determines if a term belong to some class. 1 my $x = "ABC"; $x + 3 sub id { @_ } id(10) my $f = 0; $f->("X") hiratara Types and Perl Language
  3. 3. What are “types”? Typeable: 1 sub id { @_ } id(10) Not typeable: my $x = "ABC"; $x + 3 my $f = 0; $f->("X") hiratara Types and Perl Language
  4. 4. What are “types”? It’s important whether a term is typeable or not. It isn’t important what type a term has. hiratara Types and Perl Language
  5. 5. What is “typeable”? Is this perl code typeable? sub add1 { my $n = $_[0]; return $n + 1; } hiratara Types and Perl Language
  6. 6. What is “typeable”? Or, is this C code typeable? int add1 (int n) { return n + 1; } hiratara Types and Perl Language
  7. 7. Considered as the same sub add1 { my $n = $_[0]; return $n + 1; } int add1 (int n) { return n + 1; } hiratara Types and Perl Language
  8. 8. Considered as the same Perl and C versions of add1 will be evaluated in the same way. So the Perl code are as safe as the C version. “The same way” means ... hiratara Types and Perl Language
  9. 9. λ calculus A model of computation Just a string of symbols Don’t think what it means hiratara Types and Perl Language
  10. 10. λ calculus sub add1 { my $n = $_[0]; return $n + 1; } λn.n + 1 hiratara Types and Perl Language
  11. 11. λ terms That’s all. abstraction λn. ... application fx hiratara Types and Perl Language
  12. 12. β reduction (λv.s)t β −→ [t → v]s Example (λxy.yx)z(λx.x) β −→ (λy.yz)(λx.x) β −→ (λx.x)z β −→ z hiratara Types and Perl Language
  13. 13. Typed λ calculus Evaluetion is the same with λ calculus Give lambda terms typing rules Typed terms will be evaluated correctly The type wont be changed in evaluation hiratara Types and Perl Language
  14. 14. Typing rules x: T ∈ Γ Γ x: T Γ, x: T1 t2 : T2 Γ λx: T1.t2 : T1 → T2 Γ t1 : T11 → T12 Γ t2 : T11 Γ t1t2 : T12 hiratara Types and Perl Language
  15. 15. example of Typing x: Int ∈ x: Int, y: Int x: Int, y: Int x: Int y: Int ∈ x: Int, y: Int x: Int, y: Int y: Int x: Int, y: Int x + y: Int y: Int λx.x + y: Int → Int λxy.x + y: Int → Int → Int hiratara Types and Perl Language
  16. 16. How to infer types .... (λx.x)1: ? break a problem into 2 parts building equations, and solving it. hiratara Types and Perl Language
  17. 17. Building equations x: T ∈ Γ Γ x: T|{} Γ, x: T1 t2 : T2|C Γ λx: T1.t2 : T1 → T2|C Γ t1 : X|C1 Γ t2 : T11|C2 Γ t1t2 : T12|C1 ∪ C2 ∪ {X = T11 → T12} hiratara Types and Perl Language
  18. 18. Building equations We can build equations recursively. x: T1 ∈ x: T1 x: T1 x: T1|{} λx: T1.x: T1 → T1|{} 1: Int|{} (λx: T1.x)1: T2|{T1 → T1 = Int → T2} hiratara Types and Perl Language
  19. 19. Solving equations Compare constructors {X → Y = (Int → Y ) → Y, X = Y → Y } hiratara Types and Perl Language
  20. 20. Solving equations X was Int → Y , then, remove X by substitution {X = Int → Y , Y = Y, X = Y → Y } hiratara Types and Perl Language
  21. 21. Solving equations Remove an equation satisfied X = Int → Y {Y = Y , Int → Y = Y → Y } hiratara Types and Perl Language
  22. 22. Solving equations X = Int → Y {Int → Y = Y → Y } hiratara Types and Perl Language
  23. 23. Solving equations X = Int → Y {Int = Y, Y = Y } hiratara Types and Perl Language
  24. 24. Solving equations X = Int → Int, Y = Int {Int = Int} hiratara Types and Perl Language
  25. 25. Solving equations All equetions are satisfied :) X = Int → Int, Y = Int {} hiratara Types and Perl Language
  26. 26. Infer perl types Infer the type of sub { $_[0] + 1 } The answer is sub { $_[0] : Int + 1 } : Int -> Int hiratara Types and Perl Language
  27. 27. Various types Polymorphic Type Record Type Subtype Recursive Type hiratara Types and Perl Language
  28. 28. Polymorphic Type Simple typing doesn’t work well with following terms. my $id = sub { $_[0] }; $id->("YAPC"); $id->(2013); Neither $id : Str -> Str nor $id : Int -> Int. hiratara Types and Perl Language
  29. 29. Universal quantifier x: T ∈ T, x: T T, x: T x: T T λx: T.x: T → T λT.λx: T.x: ∀T.T → T (λT.λx: T.x)Int: Int → Int 1: Int (λT.λx: T.x)Int 1: Int hiratara Types and Perl Language
  30. 30. Let-bound polymorphism Change the let rule from Γ t1 : T1 Γ, $x: T1 t2 : T2 Γ my $x =t1; t2 : T2 to Γ t1 : T1 Γ [$x → t1]t2 : T2 Γ my $x =t1; t2 : T2 hiratara Types and Perl Language
  31. 31. Let-bound polymorphism More practically, ∀ appears only in the type environment. Γ, X1, . . . , Xn t1 : T1 Γ, $x: ∀X1 . . . Xn.T1 t2 : T2 Γ my $x =t1; t2 : T2 hiratara Types and Perl Language
  32. 32. Record type Record type is the type for structures. {age => 26, name => "Perl"} : {age: Int, name: String} hiratara Types and Perl Language
  33. 33. Subtyping {l1 : T1, . . . , lk : Tk, . . . , ln : Tn} <: {l1 : T1, . . . , lk : Tk} Si <: Ti {l1 : S1, . . . , ln : Sn} <: {l1 : T1, . . . , ln : Tn} hiratara Types and Perl Language
  34. 34. Subtyping covariant and contravariant T1 <: S1 S2 <: T2 S1 → S2 <: T1 → T2 For example, sub { { x => $_[0]->{x} + $_[0]->{x}, y => $_[0]->{x} } } <: sub { { x => $_[0]->{x} + $_[0]->{y} } } hiratara Types and Perl Language
  35. 35. Infer subtyping Subtyping relations are not equivalence relation but ordering relation. It’s non-deterministic to solve inequality expressions. hiratara Types and Perl Language
  36. 36. row variables α ⊕ {l1 : T1, . . . , ln : Tn} hiratara Types and Perl Language
  37. 37. row variables if we have β ⊕ {l3 : Bool} = α ⊕ {l1 : Int, l2 : Str} α ⊕ {l1 : Int, l2 : Str} = {l1 : Int, l2 : Str, l3 : Bool} then α = {l3 : Bool} β = {l1 : Int, l2 : Str} hiratara Types and Perl Language
  38. 38. variable arguments We consider variable arguments as a record type. my $plus10 = sub { $_[0] + 10 }; $plus10->(5); $plus10->(0, "Dummy"); hiratara Types and Perl Language
  39. 39. variable arguments The type of 0, "Dummy" is {0: Int, 1: Str}, and $plus10: ∀α.α ⊕ {0: Int} → Int So α is {1: Str} hiratara Types and Perl Language
  40. 40. Object Object consists of 2 record types The record type of fields, and The record type of methods hiratara Types and Perl Language
  41. 41. Object package Language; sub hello { my $msg = "I’m " . $_[0]->{name} . ", Hello."; print($msg) } package main; my $perl = bless {name => "Perl", age => "26"}, "Language"; $perl->hello(); hiratara Types and Perl Language
  42. 42. Object An instance of Language will have this subroutine as methods &Language::hello: ∀αβγ.α ⊕ {0: (β ⊕ {name: Str}, γ)} → Unit hiratara Types and Perl Language
  43. 43. Object $perl: ∀αβγ. ( {name: Str, age: Int}, {hello: α ⊕ {0: (β ⊕ {name: Str}, γ)} → Unit} ) hiratara Types and Perl Language
  44. 44. Invoke methods $perl->hello() means Reffer the type of the hello field Pass $perl as the first argument hiratara Types and Perl Language
  45. 45. Invoke methods We must solve the following equation to infer this type. γ = {hello: α ⊕ {0: (β ⊕ {name: Str}, γ)} → Unit} hiratara Types and Perl Language
  46. 46. Recursive type The fixed point of types. We introduce the operator µ . µX.T = [µX.T → X]T hiratara Types and Perl Language
  47. 47. Recursive types $perl: ( {name: Str, age: Int}, µγ.{hello: {0: ({name: Str, age: Int}, γ)} → Unit} } ) hiratara Types and Perl Language
  48. 48. infer recursive types I wonder if this algorithm is correct, but it works for me. X = µX.T if X = T and X ∈ FV (T) [µX.T1 → X]T1 = T2 if µX.T1 = T2 and T1 = X hiratara Types and Perl Language
  49. 49. future work Subtype Variant type Meaningful errors Support Hashes and Arrays Use external Parser hiratara Types and Perl Language
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×