SlideShare a Scribd company logo
joost@de-vries․name
	joost-de-vries
	jouke
UNION	TYPES
&	
LITERAL	SINGLETON
TYPES
ING	Zandkasteel	-	Amsterdam



THREE	ACTS
1.	 What	are	they?	Why	are	they	useful?
2.	 How	to	use	them	in	Scala	right	now
3.	 Using	them	in	Dotty
①
UNION	TYPES	&
LITERAL	SINGLETON	TYPES
What	are	they?
Why	are	they	useful?
LITERAL	SINGLETON
TYPES
We	know	singleton	types:	every	scala	singleton	has	a	type
object	S{		
}
def	g(s:S.type)=s
//	g:	(s:	S.type)S$
								
A	singleton	type	is	a	type	with	just	one	instance
LITERAL	SINGLETON
TYPES
But	what	we'd	like	to	express	is	literals	in	types.	For
instance	in	Spire
forAll	{	x:	Ranged[Int,	1,	100]	=>
		val	n:	Int	=	x.value	//	guaranteed	to	be	1	to	100
}
LITERAL	SINGLETON
TYPES
And	in	Scala.js
These	are	some	of	the	motivations	mentioned	in	
				trait	HTMLCanvasElement	extends	HTMLElement	{
						def	getContext(contextId:	String):	Any
						def	getContext(contextId:	"2d"):	CanvasRenderingContext2D
				}
				val	anyContext	=	canvas.getContext("webgl")
				val	context2D	=	canvas.getConttext("2d")
								
SIP-42
UNION	TYPES
It's	or	for	types
Terminology	from	set	theory
INTERSECTION	TYPES
It's	and	for	types
TRANSLATION
And ⇒ Or
∧ ⇒ ∨
Conjunction ⇒ Disjunction
Intersection ⇒ Union
Co-product ⇒ Tuple	/	Product	/	HList
Can	be	confusing
INTERSECTION	TYPES
We	almost	have	intersection	types	in	Scala
Usually	used	for	mixins
But	A	with	B	doesn't	equal	B	with	A
				val	loggablePerson	=	new	Person	with	Loggable()
UNION	TYPES	ARE
USEFUL
It's	Either[A,B]
for	any	nr	of	types
without	boxing
/**
	*	If	'padding'	is	a	string,	then	'padding'	is	appended	to	the	left	side.
	*	If	'padding'	is	a	number,	then	that	number	of	spaces	is	added	to	the	left	side.
	*/
function	padLeft(value:	string,	padding:	string	|	number)	=	{
				//	...
}
padLeft("hello",	true)	//	doesn't	compile
UNION	TYPES
Either	can't	do	that
interface	Bird	{
				fly()
				layEggs()
}
interface	Fish	{
				swim()
				layEggs()
}
function	getSmallPet():	Fish	|	Bird	{			/*	...	*/				}
let	pet	=	getSmallPet()
pet.layEggs()	//	okay
//	pet.swim()				doesn't	compile
USE	UNION	TYPES	FOR	
NON	NULLABLE	TYPES
let	foo:	string	=	null	//	Error!
let	foo:	string	|	null	=	null	//	Okay!
Using	the	strictNullCheck	compiler	option
UNION	OF	LITERAL	TYPES
What	an	awesome	way	
to	express	enumerations!
type	Digit	=	0	|	1	|	2	|	3	|	4	|	5	|	6	|	7	|	8	|	9;
let	nums:	Digit[]	=	[1,	2,	4,	8];
nums.push(16)	//	Doesn't	compile
②
UNION	TYPES	&
LITERAL	SINGLETON	TYPES
How	to	use	them	in	Scala	right	now
UNION	TYPES	IN	SCALA
RIGHT	NOW
PROGRAMMING	IS	LIKE	LOGIC
if it is thursday there's a scala meeting
if there's a scala meeting the term 'monad' will come up
it is thursday
-------------------------------------------------------
the term 'monad' will come up
PROGRAMMING	IS	LIKE	LOGIC
it is thursday → there's a scala meeting
there's a scala meeting → the term 'monad' will come up
it is thursday
-------------------------------------------------------
the term 'monad' will come up
PROGRAMMING	IS	LIKE	LOGIC
Thursday → ScalaMeeting
ScalaMeeting → Monad
Thursday
-------------------------------------------------------
Monad
PROGRAMMING	IS	LIKE	LOGIC
val	f:		Thursday	⇒	ScalaMeeting
val	g:		ScalaMeeting	⇒	Monad
val	t:		Thursday
val	m:	Monad	=	g(f(t))
								
The	implementation	of	the	function	is	the	proof	of	its	type
IN	LOGIC
We	can	create	or	out	of	and,	not
A	or	B	⇔		not	(	not	A	and	not	B)
IN	LOGIC
We	can	create	or	out	of	and,	not
A	⋁	B	⇔		¬	(	¬A	⋀	¬B)
SCALA	TO	LOGIC
(A	with	B)	<:	A (A	∧	B)	⇒	A
(A	with	B)	<:	B (A	∧	B)	⇒	B
A	<:	(A	∨	B) A	⇒	(A	∨	B)
B	<:	(A	∨	B) B	⇒	(A	∨	B)
CREATING	OR
FROM	AND,	NOT
(A	∨	B)	⇔	¬(¬A	∧	¬B)
becomes
(A	∨	B)	=:=	¬[¬[A]	with	¬[B]]
So	where	do	we	get	not?
UNION	TYPES
IN	3	LINES	OF	CODE
Is	Miles	Sabin	cool	or	what?
An	instance	of	A	<:<	B	witnesses	that	A	is	a	subtype	of	B
type	¬[A]	=	A	=>	Nothing
type	∨[T,	U]	=	¬[¬[T]	with	¬[U]]
type	¬¬[A]	=	¬[¬[A]]
implicitly[¬¬[Int]	<:<	(Int	∨	String)]
//	res0:	<:<[¬¬[Int],∨[Int,String]]	=	<function1>	
		implicitly[¬¬[Double]	<:<	(Int	∨	String)]
//	error:	Cannot	prove	that	¬¬[Double]	<:<	∨[Int,String].
LET'S	USE	OUR	UNION	TYPE
def	padLeft[T](value:	String,	padding:	T)
						(implicit	ev:	¬¬[T]	<:<	(Int	∨	String))	=	"some	string"
padLeft("hello",	3)	//compiles
//	padLeft("hello",	true)	doesn't	compile:
//	error:	Cannot	prove	that	Test5.¬[Test5.¬[Boolean']]	<:<	Test5.∨[Int,	String].
//	padLeft("hello",	true)
UNION	TYPES
IN	3	LINES	OF	CODE
Put	the	evidence	in	a	path	dependent	type	λ
specific	to	our	types	T	and	U
type	|∨|[T,	U]	=	{	type	λ[X]	=	¬¬[X]	<:<	(T	∨	U)	}
def	padLeft2[T](value:String,	padding:T)
						(implicit	ev:	(Int	|∨|	String)#λ[T])	=	"some	string"
USE	THE	IMPLEMENTATION	IN
SHAPELESS
Union	types	are	called	Coproducts	in	Shapeless
Literal	types	(peano	numbers)	are	used	in	Sized
collections
③
UNION	TYPES	&
LITERAL	SINGLETON	TYPES
Using	them	in	Dotty
UNION	TYPES
What	we	want	to	achieve
/**
	*	If	'padding'	is	a	string,	then	'padding'	is	appended	to	the	left	side.
	*	If	'padding'	is	a	number,	then	that	number	of	spaces	is	added	to	the	left	side.
	*/
function	padLeft(value:	string,	padding:	string	|	number)	=	{
				//	...
}
padLeft("hello",	true)	//	doesn't	compile
UNION	TYPES	IN	DOTTY
/**
	*	If	'padding'	is	a	string,	then	'padding'	is	appended	to	the	left	side.
	*	If	'padding'	is	a	number,	then	that	number	of	spaces	is	added	to	the	left	side.
	*/
def	padLeft(value:	String,	padding:	String	|	Int)	=	{
				//	...
}
padLeft("hello",	true)
//	error:	type	mismatch:
//		found			:	Boolean(true)
//		required:	String	|	Int
//	padLeft("hello",	true)
//																		^
								
Cool!
UNION	TYPES	IN	DOTTY
class	Bird()	{
				def	fly()={}
				def	layEggs()={}
}
class	Fish()	{
				def	swim()={}
				def	layEggs()={}
}
def	getSmallPet()	=	if(new	Random().nextBoolean)	new	Fish()	else	new	Bird()
val	p	=	getSmallPet()
p.layEggs()
error:	value	layEggs	is	not	a	member	of	Object(p)
p.layEggs()
		^
								
Huh?
UNION	TYPES	IN	DOTTY
import	dotty.language.keepUnions
class	Bird()	{
				def	fly()={}
				def	layEggs()={}
}
class	Fish()	{
				def	swim()={}
				def	layEggs()={}
}
def	getSmallPet()	=	if(new	Random().nextBoolean)	new	Fish()	else	new	Bird()
val	p	=	getSmallPet()
p.layEggs()		//	compiles
								 Because	of	performance
of	large	nrs	of	unioned	types
UNION	TYPES	PLUS	SINGLETON
TYPES	IN	DOTTY
		object	Monday
		object	Tuesday
		//	...
		type	Weekday	=	Monday.type	|	Tuesday.type	|	Wednesday.type	|	Thursday.type	|	Friday.type
		type	Weekend	=	Saturday.type	|	Sunday.type
		type	AnyDay		=	Weekday	|	Weekend
				println("Monday	is	weekday:	"	+	Monday.isInstanceOf[Weekday])
				println("Saturday	is	weekend:	"	+	Saturday.isInstanceOf[Weekend])
				println("Sunday	is	weekday:	"	+	Sunday.isInstanceOf[Weekday])
				(Monday:	AnyDay)	match	{
						case	_:	Weekend	=>	println("shouldn't	match")
				}
								
Works	again	since	7	days	ago
UNION	TYPES	PLUS	SINGLETON
TYPES	IN	DOTTY
Bug!
		type	Weekday	=	"Monday"	|	"Tuesday"	|	"Wednesday"	|	"Thursday"	|	"Friday"
		type	Weekend	=	"Saturday"	|	"Sunday"
		type	AnyDay		=	Weekday	|	Weekend
		val	d:Weekday	=	"Sunday"		//	compiles?!
								
Currently	unions	of	literal	types	are	widened
to	String	in	this	case
UNION	TYPES	PLUS	SINGLETON
TYPES	IN	DOTTY
Same	problem
type	Digit	=	0	|	1	|	2	|	3	|	4	|	5	|	6	|	7	|	8	|	9	
def	format(ds:Seq[Digit])={	}
format(Seq(4,9,13))	//	shouldn't	compile
UNION	TYPES	PLUS	SINGLETON
TYPES	IN	DOTTY
DOTTY
It	really	is,	like	the	site	says,	pre	beta
It's	easy	to	try	out	with	the	sbt-dotty	plugin
Although	there	are	no	snapshot	builds	yet
But:	syntax	highlighting	in	the	console!
Kleurtjes!
Fin

More Related Content

Similar to Union Types and Literal Singleton Types in Scala (and Typescript)

Programming in Scala - Lecture Three
Programming in Scala - Lecture ThreeProgramming in Scala - Lecture Three
Programming in Scala - Lecture Three
Angelo Corsaro
 
Practical type mining in Scala
Practical type mining in ScalaPractical type mining in Scala
Practical type mining in Scala
Rose Toomey
 
09_java_DataTypesand associated class.ppt
09_java_DataTypesand associated class.ppt09_java_DataTypesand associated class.ppt
09_java_DataTypesand associated class.ppt
RameshKumarYadav29
 
typescript.pptx
typescript.pptxtypescript.pptx
typescript.pptx
ZeynepOtu
 
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Philip Schwarz
 
Swift Study #3
Swift Study #3Swift Study #3
Swift Study #3
chanju Jeon
 
(4) collections algorithms
(4) collections algorithms(4) collections algorithms
(4) collections algorithms
Nico Ludwig
 
(4) collections algorithms
(4) collections algorithms(4) collections algorithms
(4) collections algorithms
Nico Ludwig
 
Concept of c data types
Concept of c data typesConcept of c data types
Concept of c data types
Manisha Keim
 
Automatic Type Class Derivation with Shapeless
Automatic Type Class Derivation with ShapelessAutomatic Type Class Derivation with Shapeless
Automatic Type Class Derivation with Shapeless
jcazevedo
 
Apollo Server III
Apollo Server IIIApollo Server III
Apollo Server III
NodeXperts
 

Similar to Union Types and Literal Singleton Types in Scala (and Typescript) (11)

Programming in Scala - Lecture Three
Programming in Scala - Lecture ThreeProgramming in Scala - Lecture Three
Programming in Scala - Lecture Three
 
Practical type mining in Scala
Practical type mining in ScalaPractical type mining in Scala
Practical type mining in Scala
 
09_java_DataTypesand associated class.ppt
09_java_DataTypesand associated class.ppt09_java_DataTypesand associated class.ppt
09_java_DataTypesand associated class.ppt
 
typescript.pptx
typescript.pptxtypescript.pptx
typescript.pptx
 
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
 
Swift Study #3
Swift Study #3Swift Study #3
Swift Study #3
 
(4) collections algorithms
(4) collections algorithms(4) collections algorithms
(4) collections algorithms
 
(4) collections algorithms
(4) collections algorithms(4) collections algorithms
(4) collections algorithms
 
Concept of c data types
Concept of c data typesConcept of c data types
Concept of c data types
 
Automatic Type Class Derivation with Shapeless
Automatic Type Class Derivation with ShapelessAutomatic Type Class Derivation with Shapeless
Automatic Type Class Derivation with Shapeless
 
Apollo Server III
Apollo Server IIIApollo Server III
Apollo Server III
 

Recently uploaded

Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
shyamraj55
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
Neo4j
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
Rohit Gautam
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”
Claudio Di Ciccio
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
SOFTTECHHUB
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Zilliz
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
Neo4j
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 

Recently uploaded (20)

Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with SlackLet's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
Let's Integrate MuleSoft RPA, COMPOSER, APM with AWS IDP along with Slack
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”“I’m still / I’m still / Chaining from the Block”
“I’m still / I’m still / Chaining from the Block”
 
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
Why You Should Replace Windows 11 with Nitrux Linux 3.5.0 for enhanced perfor...
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 

Union Types and Literal Singleton Types in Scala (and Typescript)