SlideShare ist ein Scribd-Unternehmen logo
1 von 63
Downloaden Sie, um offline zu lesen
ReasonML
Strict, powerful, and forgiving
Me
After a few
months...
Okay, this is like
real work now...
After a few
months...
After a few
months...
After a few
months...
This looks
interesting.
Looks familiar
enough...
Oooh. Smart
people language.
Buckle… script.
Oh, I get it...
It’s so weird.
And fascinating!
Go!
That’s it?
npm install -g bs-platform
npm install -g reason-cli@latest-macos
(or linux)
All right then.
Let’s code.
Static types? Check!
Type inference? Check!
let car = "Blue Maruti 800";
'use strict';
var car = "Blue Maruti 800";
exports.car = car;
let car = "Blue Maruti 800";
/* This is fine. */
Js.log(car ++ " is sold out");
var car = "Blue Maruti 800";
console.log(
"Blue Maruti 800 is sold out"
);
let car = "Blue Maruti 800";
/* This is not OK. */
Js.log(car + 1);
We've found a bug for you!
This has type:
string
But somewhere wanted:
int
let myFirstCar = {
colour: "Blue",
make: "Maruti",
model: "800"
};
We've found a bug for you!
The record field colour can't
be found.
type car = {
colour: string,
make: string,
model: string
};
let myFirstCar = {
colour: "Blue",
make: "Maruti",
model: "800"
};
var myFirstCar = /* record */[
/* colour */"Blue",
/* make */"Maruti",
/* model */"800"
];
type colour = Red | Blue | White | Pink;
type colour = Red | Blue | White | Pink;
That’s a Variant.
type colour = Red | Blue | White | Pink;
These are the variant’s constructors.
type make = Maruti | HindustanMotors;
type model = EightHundred | Zen | Ambassador;
type colour = Red | Blue | White | Pink;
type car = {
make: make,
model: model,
colour: colour
};
let myFirstCar = {
var myFirstCar =
/* colour : Blu
/* make : Marut
/* model : Eigh
];
make: make,
model: model,
colour: colour
};
let myFirstCar = {
make: Maruti,
model: EightHundred,
colour: Blue
};
var myFirstCar =
/* colour : Blu
/* make : Marut
/* model : Eigh
];
ar = {
i,
tHundred,
e
var myFirstCar = /* record */[
/* colour : Blue */1,
/* make : Maruti */0,
/* model : EightHundred */0
];
model: EightHundred,
colour: Blue
};
let productionRun = car => {
switch (car.model) {
| EightHundred => "1983 to 2013"
}
};
var Caml_builtin_exception
require("./stdlib/caml_bui
function productionRun(car
var match = car[/* model
if (match !== 0) {
throw [
Caml_builtin_exc
/* tuple */[
".",
19,
2
]
];
} else {
return "1983 to 2013";
}
}
d
Run = car => {
odel) {
d => "1983 to 2013"
var Caml_builtin_exceptions =
require("./stdlib/caml_builtin_exceptions.js");
function productionRun(car) {
var match = car[/* model */2];
if (match !== 0) {
throw [
Caml_builtin_exceptions.match_failure,
/* tuple */[
".",
19,
2
]
];
} else {
return "1983 to 2013";
}
}
make: Maruti,
model: EightHundred,
colour: Blue
};
let productionRun = car => {
switch (car.model) {
| EightHundred => "1983 to 2013"
}
};
Warning number 8
You forgot to handle a possible
value here, for example:
(Zen|Ambassador)
model: EightHundred,
colour: Blue
};
let productionRun = car => {
switch (car.model) {
| EightHundred => "1983 to 2013"
| Ambassador => "1958 to 2014"
| Zen => "1993 to present"
}
};
function productionRun(car) {
var match = car[/* model */2];
switch (match) {
case 0 :
return "1983 to 2013";
case 1 :
return "1993 to present";
case 2 :
return "1958 to 2014";
}
}
Warning number 8
You forgot to handle a possible
value here, for example:
(Zen|Ambassador)
Use variants to
describe possibilities.
Got it.
type make = Maruti | HindustanMotors;
type model = EightHundred | Zen | Ambassador;
type colour = Red | Blue | White | Pink;
type car = {
make: make,
model: model,
colour: colour,
};
let abomination = {
make: HindustanMotors,
model: Ambassador,
colour: Pink
};
var abomination = /* record */[
/* colour : Pink */3,
/* make : HindustanMotors */1,
/* model : Ambassador */2
];
/* Nope, not available. */
let pink800 = {
make: Maruti,
model: EightHundred,
colour: Pink
};
/* You can buy one of these. */
let pinkZen = {
make: Maruti,
model: Zen,
colour: Pink
};
var pink800 = /* record */[
/* colour : Pink */3,
/* make : Maruti */0,
/* model : EightHundred */0
];
var pinkZen = /* record */[
/* colour : Pink */3,
/* make : Maruti */0,
/* model : Zen */1
];
/* Wut?! */
let marutiAmbassador = {
make: Maruti,
model: Ambassador,
colour: Pink
};
var marutiAmbassador = /* record
*/[
/* colour : Pink */3,
/* make : Maruti */0,
/* model : Ambassador */2
];
type car = {
make: make,
model: model,
colour: colour
};
/* Wut?! */
let marutiAmbassador = {
make: Maruti,
var marutiAmbassador = /* record
*/[
/* colour : Pink */3,
/* make : Maruti */0,
/* model : Ambassador */2
];
type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */
type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */
type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */
type marutiModel = EightHundred(ehColour) | Zen(zenColour);
type hmModel = Ambassador(ambiColour);
type make = Maruti(marutiModel) | HindustanMotors(hmModel);
type car = { make: make };
type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */
type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */
type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */
type marutiModel = EightHundred(ehColour) | Zen(zenColour);
type hmModel = Ambassador(ambiColour);
type car = Maruti(marutiModel) | HindustanMotors(hmModel);
let blueMaruti =
Maruti(EightHundred(BlueBlaze));
var Block = require("./stdlib/block.js");
var blueMaruti = /* Maruti */Block.__(0, [
/* EightHundred */Block.__(0, [
/* BlueBlaze */0
])
]);
let pinkAmbassador =
HindustanMotors(Ambassador(FusionPink));
We've found a bug for you!
This variant expression
is expected to have type
ambiColour
The constructor
FusionPink does not
belong to type ambiColour
let marutiAmbassador =
Maruti(Ambassador(BlueBlaze));
We've found a bug for you!
This variant expression
is expected to have type
marutiModel
The constructor
Ambassador does not
belong to type
marutiModel
Make illegal states unrepresentable.
So, that takes
care of data on
the inside.
But what about
stuff from the
outside?
let make = "Maruti";
let model = "Ambassador";
let colour = "FusionPink";
let productionRun = car => {
/* Production run as a string. */
};
let inStock = car => {
/**
* Boolean indicating whether
* car model is in stock.
*/
}
type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */
type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */
type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */
type marutiModel = EightHundred(ehColour) | Zen(zenColour);
type hmModel = Ambassador(ambiColour);
type car = Maruti(marutiModel) | HindustanMotors(hmModel);
Maruti
Maruti
Hindustan
Motors
800
Zen
Ambassador
Jet
Black
Fusion
Pink
Blaze
Blue
Maruti
Ambassador
Fusion
Pink
let make = "Maruti";
let model = "Ambassador";
let colour = "FusionPink";
Where are you
going with this?
Where are you
going with this?
Make illegal states unrepresentable.
Variants
Compiler
Make illegal states unrepresentable.
Variants
Compiler
Pattern-matching
Functions
Make illegal states unrepresentable.
Parse all external data & enforce
boundaries.
Make illegal states unrepresentable.
Parse all external data & enforce
boundaries.
Mint a module for every type.
Enforce invariants using the module
interface.
Perform compiler-assisted
refactoring.
Use equational reasoning.
Variants
Compiler
Pattern-matching
Functions
Modules
Abstract types
Referential transparency
Variants
Compiler
Pattern-matching
Functions
Modules
Abstract types
Referential transparency
Make illegal states unrepresentable.
Parse all external data & enforce
boundaries.
Mint a module for every type.
Enforce invariants using the module
interface.
Perform compiler-assisted
refactoring.
Use equational reasoning.
Patterns!
Features!
let f = (~x, ~y=0) => Js.log2(x, y);
Warning number 16
This optional parameter in final
position will, in practice, not be
optional.
Reorder the parameters so that at least
one non-optional one is in final
position or, if all parameters are
optional, insert a final ().
Explanation: If the final parameter is
optional, it'd be unclear whether a
function application that omits it
should be considered fully applied, or
partially applied. Imagine writing `let
title = display("hello!")`, only to
realize `title` isn't your desired
result, but a curried call that takes a
final optional argument, e.g.
`~showDate`.
Formal rule: an optional argument is
considered intentionally omitted when
the 1st positional (i.e. neither
labeled nor optional) argument defined
after it is passed in.
let x = 1;
let y = 2.4;
Js.log(x + y);
We've found a bug for you!
This has type:
float
But somewhere wanted:
int
You can convert a float to a int
with int_of_float.If this is a
literal, you want a number
without a trailing dot (e.g.
20).
let make = _children => {
...component,
initialState: () => { x: "Hello" },
render: self => {
{ self.state.x |> ReasonReact.string; }
}
};
We've found a bug for you!
Is this a ReasonReact
reducerComponent or component
with retained props?
If so, is the type for state,
retained props or action
declared _after_
the component declaration?
Moving these types above the
component declaration should
resolve this!
Bye!
@harigopal
mail@harigopal.in
turaku.com
discord.gg/reasonml
reasonml.chat

Weitere ähnliche Inhalte

Ähnlich wie ReasonML: Strict, Powerful, and Forgiving

ONLY EDIT CapacityOptimizer.java, Simulator.java, and TriangularD.pdf
ONLY EDIT  CapacityOptimizer.java, Simulator.java, and TriangularD.pdfONLY EDIT  CapacityOptimizer.java, Simulator.java, and TriangularD.pdf
ONLY EDIT CapacityOptimizer.java, Simulator.java, and TriangularD.pdfvinodagrawal6699
 
R, Scikit-Learn and Apache Spark ML - What difference does it make?
R, Scikit-Learn and Apache Spark ML - What difference does it make?R, Scikit-Learn and Apache Spark ML - What difference does it make?
R, Scikit-Learn and Apache Spark ML - What difference does it make?Villu Ruusmann
 
Automobile.javapublic class Automobile {    Declaring instan.pdf
Automobile.javapublic class Automobile {    Declaring instan.pdfAutomobile.javapublic class Automobile {    Declaring instan.pdf
Automobile.javapublic class Automobile {    Declaring instan.pdfanitasahani11
 
C#i need help creating the instance of stream reader to read from .pdf
C#i need help creating the instance of stream reader to read from .pdfC#i need help creating the instance of stream reader to read from .pdf
C#i need help creating the instance of stream reader to read from .pdfajantha11
 
The Ring programming language version 1.10 book - Part 97 of 212
The Ring programming language version 1.10 book - Part 97 of 212The Ring programming language version 1.10 book - Part 97 of 212
The Ring programming language version 1.10 book - Part 97 of 212Mahmoud Samir Fayed
 
#include iostream#include string#include iomanip#inclu.docx
#include iostream#include string#include iomanip#inclu.docx#include iostream#include string#include iomanip#inclu.docx
#include iostream#include string#include iomanip#inclu.docxmayank272369
 
(9) cpp abstractions separated_compilation_and_binding_part_ii
(9) cpp abstractions separated_compilation_and_binding_part_ii(9) cpp abstractions separated_compilation_and_binding_part_ii
(9) cpp abstractions separated_compilation_and_binding_part_iiNico Ludwig
 
Assignment DIn Problem D1 we will use a file to contain the dat.pdf
Assignment DIn Problem D1 we will use a file to contain the dat.pdfAssignment DIn Problem D1 we will use a file to contain the dat.pdf
Assignment DIn Problem D1 we will use a file to contain the dat.pdffasttrackscardecors
 
Compiler Design and Construction COSC 5353Project Instructions -
Compiler Design and Construction COSC 5353Project Instructions -Compiler Design and Construction COSC 5353Project Instructions -
Compiler Design and Construction COSC 5353Project Instructions -LynellBull52
 
C++ Program Auto workshop service system
C++ Program Auto workshop service systemC++ Program Auto workshop service system
C++ Program Auto workshop service systemShahzaib Farooq
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascriptmpnkhan
 
Gift-VT Tools Development Overview
Gift-VT Tools Development OverviewGift-VT Tools Development Overview
Gift-VT Tools Development Overviewstn_tkiller
 
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator OverloadingHadziq Fabroyir
 
Treatment, Architecture and Threads
Treatment, Architecture and ThreadsTreatment, Architecture and Threads
Treatment, Architecture and ThreadsMathias Seguy
 
Loops in C# for loops while and do while loop.
Loops in C# for loops while and do while loop.Loops in C# for loops while and do while loop.
Loops in C# for loops while and do while loop.Abid Kohistani
 
C++ Advanced
C++ AdvancedC++ Advanced
C++ AdvancedVivek Das
 

Ähnlich wie ReasonML: Strict, Powerful, and Forgiving (20)

ONLY EDIT CapacityOptimizer.java, Simulator.java, and TriangularD.pdf
ONLY EDIT  CapacityOptimizer.java, Simulator.java, and TriangularD.pdfONLY EDIT  CapacityOptimizer.java, Simulator.java, and TriangularD.pdf
ONLY EDIT CapacityOptimizer.java, Simulator.java, and TriangularD.pdf
 
R, Scikit-Learn and Apache Spark ML - What difference does it make?
R, Scikit-Learn and Apache Spark ML - What difference does it make?R, Scikit-Learn and Apache Spark ML - What difference does it make?
R, Scikit-Learn and Apache Spark ML - What difference does it make?
 
Automobile.javapublic class Automobile {    Declaring instan.pdf
Automobile.javapublic class Automobile {    Declaring instan.pdfAutomobile.javapublic class Automobile {    Declaring instan.pdf
Automobile.javapublic class Automobile {    Declaring instan.pdf
 
C#i need help creating the instance of stream reader to read from .pdf
C#i need help creating the instance of stream reader to read from .pdfC#i need help creating the instance of stream reader to read from .pdf
C#i need help creating the instance of stream reader to read from .pdf
 
The Ring programming language version 1.10 book - Part 97 of 212
The Ring programming language version 1.10 book - Part 97 of 212The Ring programming language version 1.10 book - Part 97 of 212
The Ring programming language version 1.10 book - Part 97 of 212
 
#include iostream#include string#include iomanip#inclu.docx
#include iostream#include string#include iomanip#inclu.docx#include iostream#include string#include iomanip#inclu.docx
#include iostream#include string#include iomanip#inclu.docx
 
(9) cpp abstractions separated_compilation_and_binding_part_ii
(9) cpp abstractions separated_compilation_and_binding_part_ii(9) cpp abstractions separated_compilation_and_binding_part_ii
(9) cpp abstractions separated_compilation_and_binding_part_ii
 
Assignment DIn Problem D1 we will use a file to contain the dat.pdf
Assignment DIn Problem D1 we will use a file to contain the dat.pdfAssignment DIn Problem D1 we will use a file to contain the dat.pdf
Assignment DIn Problem D1 we will use a file to contain the dat.pdf
 
Compiler Design and Construction COSC 5353Project Instructions -
Compiler Design and Construction COSC 5353Project Instructions -Compiler Design and Construction COSC 5353Project Instructions -
Compiler Design and Construction COSC 5353Project Instructions -
 
C# Programming Help
C# Programming HelpC# Programming Help
C# Programming Help
 
C++ Program Auto workshop service system
C++ Program Auto workshop service systemC++ Program Auto workshop service system
C++ Program Auto workshop service system
 
Kotlin
KotlinKotlin
Kotlin
 
Itsjustangular
ItsjustangularItsjustangular
Itsjustangular
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Gift-VT Tools Development Overview
Gift-VT Tools Development OverviewGift-VT Tools Development Overview
Gift-VT Tools Development Overview
 
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading#OOP_D_ITS - 5th - C++ Oop Operator Overloading
#OOP_D_ITS - 5th - C++ Oop Operator Overloading
 
Introduction to Swift
Introduction to SwiftIntroduction to Swift
Introduction to Swift
 
Treatment, Architecture and Threads
Treatment, Architecture and ThreadsTreatment, Architecture and Threads
Treatment, Architecture and Threads
 
Loops in C# for loops while and do while loop.
Loops in C# for loops while and do while loop.Loops in C# for loops while and do while loop.
Loops in C# for loops while and do while loop.
 
C++ Advanced
C++ AdvancedC++ Advanced
C++ Advanced
 

Kürzlich hochgeladen

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 

Kürzlich hochgeladen (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 

ReasonML: Strict, Powerful, and Forgiving

  • 2. Me
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 9. Okay, this is like real work now... After a few months...
  • 12.
  • 17. It’s so weird. And fascinating!
  • 18. Go!
  • 19. That’s it? npm install -g bs-platform npm install -g reason-cli@latest-macos (or linux)
  • 21. Static types? Check! Type inference? Check!
  • 22. let car = "Blue Maruti 800"; 'use strict'; var car = "Blue Maruti 800"; exports.car = car;
  • 23. let car = "Blue Maruti 800"; /* This is fine. */ Js.log(car ++ " is sold out"); var car = "Blue Maruti 800"; console.log( "Blue Maruti 800 is sold out" );
  • 24. let car = "Blue Maruti 800"; /* This is not OK. */ Js.log(car + 1); We've found a bug for you! This has type: string But somewhere wanted: int
  • 25. let myFirstCar = { colour: "Blue", make: "Maruti", model: "800" }; We've found a bug for you! The record field colour can't be found.
  • 26. type car = { colour: string, make: string, model: string }; let myFirstCar = { colour: "Blue", make: "Maruti", model: "800" }; var myFirstCar = /* record */[ /* colour */"Blue", /* make */"Maruti", /* model */"800" ];
  • 27. type colour = Red | Blue | White | Pink;
  • 28. type colour = Red | Blue | White | Pink; That’s a Variant.
  • 29. type colour = Red | Blue | White | Pink; These are the variant’s constructors.
  • 30. type make = Maruti | HindustanMotors; type model = EightHundred | Zen | Ambassador; type colour = Red | Blue | White | Pink; type car = { make: make, model: model, colour: colour }; let myFirstCar = { var myFirstCar = /* colour : Blu /* make : Marut /* model : Eigh ];
  • 31. make: make, model: model, colour: colour }; let myFirstCar = { make: Maruti, model: EightHundred, colour: Blue }; var myFirstCar = /* colour : Blu /* make : Marut /* model : Eigh ];
  • 32. ar = { i, tHundred, e var myFirstCar = /* record */[ /* colour : Blue */1, /* make : Maruti */0, /* model : EightHundred */0 ];
  • 33. model: EightHundred, colour: Blue }; let productionRun = car => { switch (car.model) { | EightHundred => "1983 to 2013" } }; var Caml_builtin_exception require("./stdlib/caml_bui function productionRun(car var match = car[/* model if (match !== 0) { throw [ Caml_builtin_exc /* tuple */[ ".", 19, 2 ] ]; } else { return "1983 to 2013"; } }
  • 34. d Run = car => { odel) { d => "1983 to 2013" var Caml_builtin_exceptions = require("./stdlib/caml_builtin_exceptions.js"); function productionRun(car) { var match = car[/* model */2]; if (match !== 0) { throw [ Caml_builtin_exceptions.match_failure, /* tuple */[ ".", 19, 2 ] ]; } else { return "1983 to 2013"; } }
  • 35. make: Maruti, model: EightHundred, colour: Blue }; let productionRun = car => { switch (car.model) { | EightHundred => "1983 to 2013" } }; Warning number 8 You forgot to handle a possible value here, for example: (Zen|Ambassador)
  • 36. model: EightHundred, colour: Blue }; let productionRun = car => { switch (car.model) { | EightHundred => "1983 to 2013" | Ambassador => "1958 to 2014" | Zen => "1993 to present" } }; function productionRun(car) { var match = car[/* model */2]; switch (match) { case 0 : return "1983 to 2013"; case 1 : return "1993 to present"; case 2 : return "1958 to 2014"; } }
  • 37. Warning number 8 You forgot to handle a possible value here, for example: (Zen|Ambassador) Use variants to describe possibilities. Got it.
  • 38. type make = Maruti | HindustanMotors; type model = EightHundred | Zen | Ambassador; type colour = Red | Blue | White | Pink; type car = { make: make, model: model, colour: colour, };
  • 39. let abomination = { make: HindustanMotors, model: Ambassador, colour: Pink }; var abomination = /* record */[ /* colour : Pink */3, /* make : HindustanMotors */1, /* model : Ambassador */2 ];
  • 40. /* Nope, not available. */ let pink800 = { make: Maruti, model: EightHundred, colour: Pink }; /* You can buy one of these. */ let pinkZen = { make: Maruti, model: Zen, colour: Pink }; var pink800 = /* record */[ /* colour : Pink */3, /* make : Maruti */0, /* model : EightHundred */0 ]; var pinkZen = /* record */[ /* colour : Pink */3, /* make : Maruti */0, /* model : Zen */1 ];
  • 41. /* Wut?! */ let marutiAmbassador = { make: Maruti, model: Ambassador, colour: Pink }; var marutiAmbassador = /* record */[ /* colour : Pink */3, /* make : Maruti */0, /* model : Ambassador */2 ];
  • 42. type car = { make: make, model: model, colour: colour }; /* Wut?! */ let marutiAmbassador = { make: Maruti, var marutiAmbassador = /* record */[ /* colour : Pink */3, /* make : Maruti */0, /* model : Ambassador */2 ];
  • 43. type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */ type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */ type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */ type marutiModel = EightHundred(ehColour) | Zen(zenColour); type hmModel = Ambassador(ambiColour); type make = Maruti(marutiModel) | HindustanMotors(hmModel); type car = { make: make };
  • 44. type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */ type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */ type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */ type marutiModel = EightHundred(ehColour) | Zen(zenColour); type hmModel = Ambassador(ambiColour); type car = Maruti(marutiModel) | HindustanMotors(hmModel);
  • 45. let blueMaruti = Maruti(EightHundred(BlueBlaze)); var Block = require("./stdlib/block.js"); var blueMaruti = /* Maruti */Block.__(0, [ /* EightHundred */Block.__(0, [ /* BlueBlaze */0 ]) ]);
  • 46. let pinkAmbassador = HindustanMotors(Ambassador(FusionPink)); We've found a bug for you! This variant expression is expected to have type ambiColour The constructor FusionPink does not belong to type ambiColour
  • 47. let marutiAmbassador = Maruti(Ambassador(BlueBlaze)); We've found a bug for you! This variant expression is expected to have type marutiModel The constructor Ambassador does not belong to type marutiModel
  • 48. Make illegal states unrepresentable.
  • 49. So, that takes care of data on the inside.
  • 50. But what about stuff from the outside?
  • 51. let make = "Maruti"; let model = "Ambassador"; let colour = "FusionPink";
  • 52. let productionRun = car => { /* Production run as a string. */ }; let inStock = car => { /** * Boolean indicating whether * car model is in stock. */ }
  • 53. type ambiColour = JetBlack | OysterBlue | FireBrickRed | EcruBeige; /* and more */ type zenColour = BeamBlue | PearlSilver | BrightRed | FusionPink; /* and more */ type ehColour = BlueBlaze | SilkySilver | BrickRed | SuperiorWhite; /* and more */ type marutiModel = EightHundred(ehColour) | Zen(zenColour); type hmModel = Ambassador(ambiColour); type car = Maruti(marutiModel) | HindustanMotors(hmModel);
  • 55. Maruti Ambassador Fusion Pink let make = "Maruti"; let model = "Ambassador"; let colour = "FusionPink";
  • 56. Where are you going with this?
  • 57. Where are you going with this? Make illegal states unrepresentable.
  • 59. Variants Compiler Pattern-matching Functions Make illegal states unrepresentable. Parse all external data & enforce boundaries.
  • 60. Make illegal states unrepresentable. Parse all external data & enforce boundaries. Mint a module for every type. Enforce invariants using the module interface. Perform compiler-assisted refactoring. Use equational reasoning. Variants Compiler Pattern-matching Functions Modules Abstract types Referential transparency
  • 61. Variants Compiler Pattern-matching Functions Modules Abstract types Referential transparency Make illegal states unrepresentable. Parse all external data & enforce boundaries. Mint a module for every type. Enforce invariants using the module interface. Perform compiler-assisted refactoring. Use equational reasoning. Patterns! Features!
  • 62. let f = (~x, ~y=0) => Js.log2(x, y); Warning number 16 This optional parameter in final position will, in practice, not be optional. Reorder the parameters so that at least one non-optional one is in final position or, if all parameters are optional, insert a final (). Explanation: If the final parameter is optional, it'd be unclear whether a function application that omits it should be considered fully applied, or partially applied. Imagine writing `let title = display("hello!")`, only to realize `title` isn't your desired result, but a curried call that takes a final optional argument, e.g. `~showDate`. Formal rule: an optional argument is considered intentionally omitted when the 1st positional (i.e. neither labeled nor optional) argument defined after it is passed in. let x = 1; let y = 2.4; Js.log(x + y); We've found a bug for you! This has type: float But somewhere wanted: int You can convert a float to a int with int_of_float.If this is a literal, you want a number without a trailing dot (e.g. 20). let make = _children => { ...component, initialState: () => { x: "Hello" }, render: self => { { self.state.x |> ReasonReact.string; } } }; We've found a bug for you! Is this a ReasonReact reducerComponent or component with retained props? If so, is the type for state, retained props or action declared _after_ the component declaration? Moving these types above the component declaration should resolve this!