View
3
Download
0
Category
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
xτ
�. . ?� �τ� �� � � �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
Recommended