Howdowe bind type variables? · tick (MkT = MkT newVal upd toInt where val upd toInt) newVal = upd...

Preview:

Citation preview

typevariables??How do webind

typevariables??How webindshould

xconsys=x:ys

prefix::prefixxyss=mapxconsysswhere

a![[a]]![[a]]

prefix::prefixxyss=mapxconsysswhere

xconsys=x:ysxcons::[a]![a]

a![[a]]![[a]]

prefix::prefixxyss=mapxconsysswhere

xconsys=x:ysxcons::[a]![a]

Couldn'tmatch‘a1’with‘a’‘a1’isboundinxcons::∀a1.[a1]->[a1]

A � � . �a � �a1!

a![[a]]![[a]]

prefix::prefixxyss=mapxconsysswhere

xconsys=x:ysxcons::[a]![a]

a![[a]]![[a]]∀a.

{-#LANGUAGEScopedTypeVariables#-}

Ok,onemoduleloaded.

Typesignaturesareuseful

Goal:Allowatypesignatureon

anyexpression

Typesignaturesareuseful•type-classambiguity

show::Showa⇒a!Stringread::Reada⇒String!a

normalize::String!Stringnormalize=show.read

. � � � . ? �

Typesignaturesareuseful•type-classambiguity•polymorphicrecursion

dataTa=Leafa|Node(T[a])(T[a])

leaves::Ta![a]leaves(Leafx)=[x]leaves(Nodet1t2)=concat(leavest1++leavest2)

�? . A � ?� ??.

Typesignaturesareuseful•type-classambiguity•polymorphicrecursion•higher-ranktypes

ScrapYourBoilerplate[TLDI'03]:

everywhere::(∀a.Dataa⇒a!a)

∀a.Dataa⇒a!a!�? . A � ?� ??.

Typesignaturesareuseful•type-classambiguity•polymorphicrecursion•higher-ranktypes•GADTs dataGawhere

MkInt::GIntMkFun::G(Int!Int)

matchG::Ga!amatchGMkInt=5matchGMkFun=(10+)

Typesignaturesareuseful•type-classambiguity•polymorphicrecursion•higher-ranktypes•GADTs dataGawhere

MkInt::GIntMkFun::G(Int!Int)

matchG::Ga!amatchGMkInt=5matchGMkFun=(10+)

�? . A � ?� ??.

Typesignaturesareuseful•type-classambiguity•polymorphicrecursion•higher-ranktypes•GADTs•inherentambiguitytypefamilyFaambig::Typeablea⇒Fa!Inttest::Char!Inttestx=ambigx

� . �� �a

Typesignaturesareuseful

Goal:Allowatypesignatureon

anyexpression

Solution:ScopedTypeVariableScopedTypeVariables

ScopedTypeVariablesprefix::prefixxyss=mapxconsysswhere

xconsys=x:ysxcons::[a]![a]

a![[a]]![[a]]∀a.

prefix(x::a)yss=mapxconsysswherexcons::[a]![a]xconsys=x:ys

. �? . A

ScopedTypeVariablesprefix(x::a)yss=mapxconsysswherexcons::[a]![a]xconsys= x:ys

Ok,onemoduleloaded.λ>:tprefixprefix::

1:

Numa⇒a![[a]]![[a]]

ScopedTypeVariablesprefix(x::a)yss=mapxconsysswherexcons::[a]![a]xconsys= x:ysTrue:

Couldn'tmatchawithBool

Rule:typevariablesmustbevariables

Arbitrary?

ScopedTypeVariablesWhatisthespecificationof

anyway?

Typingrules!Contribution:

ExistentialsdataTickerwhereMkT::∀a.a!(a!a)!(a!Int)!TickerD ? .

tick::Ticker!Tickertick(MkT=MkTnewValupdtoIntwhere

val updtoInt)

newVal=updval

dataTickerwhereMkT::∀a.a!(a!a)!(a!Int)!Ticker

tick::Ticker!Tickertick(MkT=MkTnewValupdtoIntwhere

val updtoInt)

newVal=updvalnewVal::a

. � ?� ?

Existentials

dataTickerwhereMkT::∀a.a!(a!a)!(a!Int)!Ticker

tick::Ticker!Tickertick(MkT=MkTnewValupdtoIntwhere

val updtoInt)

newVal=updvalnewVal::a

( ::a)

� � . � � �a

Existentials

ExistentialsdataElabwhereMkE::Showa⇒[Maybe(Tree(a,Int))]!Elab

.� . �? . A � ��a� A � �

Existentials

typefamilyFadataExFwhereMkF::Typeablea⇒Fa!ExF

.� . �? . A � ��a� A � �

??

Typesignaturesareuseful

Goal:Allowatypesignatureon

anyexpression

Solution:ScopedTypeVariableScopedTypeVariables

Solution:ScopedTypeVariableScopedTypeVariables

Partial

Contribution:Patterntypeapplications

PatterntypeapplicationsdataTickerwhereMkT::∀a.a!(a!a)!(a!Int)!Ticker

tick::Ticker!Tickertick(MkT=MkTnewValupdtoIntwhere

val updtoInt)

newVal=updvalnewVal::a

@a

Patterntypeapplications

Explicitbindingoftypevariablesalwaysworks

UniversalsvsExistentialsdataUnivExawhereMkUE::a!b!UnivExa

A ?. D ? .

caseueofMkUE@a@bxy!...

::UnivE

�. . ?� �τ� �� � � �a

UniversalsvsExistentials

�. . ?� �τ� �� � � �a

Uniformity

dataConfusedawhereMkC::a~b⇒b!Confuseda

. � ?� D ? . ¯\_(ϑ)_/¯

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

�. . ?� �.� .

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

D � ?A � �. A ?

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

A. � � . . ?

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

? A � ? .

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

?A � �. A ?

Universals&Existentials

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

".??A � � (),� A. ? "

" � � � � �� �. . ?"

Γ⊢K@τ1..mp1..n:Tσ1..j

...K:∀a1..m.Q⇒η1..n→Tφ1..jΓ,Q,φ1..j~σ1..j⊩τ1..m~a1..m

".??A � � (),� A. ? "

" � � � � �� �. . ?"

dataExamplewhereMkEx::∀ab.(a~Maybeb)⇒Example

Example

casex::ExampleofMkEx@a@b!...MkEx@(Maybeb)@b!...MkEx@(Maybeb)!...MkEx@a@(Maybeb)!...

Whythisbehavior?

It'sexactlyhowpatternsignatureswouldwork.

Inthepaper:fullspecificationwithtypingrules

Upshot:wecaneasilydropthevariablerestriction

NextSteps

Implementation:MyNguyen

Bindingtypevariablesinλ-expressions� . �. D

TypeVariablesinPatternsRichardA.EisenbergBrynMawrCollege

rae@cs.brynmawr.edu

Friday,September28,2018HaskellSymposiumSt.Louis,MO,USA

JoachimBreitnerDFINITYFoundationjoachim@dfinity.org

SimonPeytonJonesMicrosoftResearch,Cambridge

simonpj@microsoft.com