Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ReasonML @ OCaml Users in Paris
Search
Matthias Le Brun
September 26, 2017
Programming
0
520
ReasonML @ OCaml Users in Paris
Matthias Le Brun
September 26, 2017
Tweet
Share
More Decks by Matthias Le Brun
See All by Matthias Le Brun
(why the hell did I) build a GraphQL client for the browser
bloodyowl
0
49
Boxed: bringing algebraic types to TypeScript
bloodyowl
0
88
leveraging (algebraic data) types to make your UI rock @ jsheroes
bloodyowl
0
270
Leveraging (algebraic data) types to make your UI rock solid
bloodyowl
0
380
La drôle d'histoire de JavaScript
bloodyowl
0
340
Healthy Code Collaboration
bloodyowl
0
260
Simplify your UI management with (algebraic data) types
bloodyowl
0
800
Simplify your UI management with (algebraic data) types
bloodyowl
1
510
Migrating a large Reason+React codebase to hooks
bloodyowl
0
530
Other Decks in Programming
See All in Programming
Cursorを活用したAIプログラミングについて 入門
rect
0
150
スモールスタートで始めるためのLambda×モノリス(Lambdalith)
akihisaikeda
2
340
generative-ai-use-cases(GenU)の推しポイント ~2025年4月版~
hideg
1
370
個人開発の学生アプリが企業譲渡されるまで
akidon0000
2
1.1k
Empowering Developers with HTML-Aware ERB Tooling @ RubyKaigi 2025, Matsuyama, Ehime
marcoroth
2
950
The Missing Link in Angular’s Signal Story: Resource API and httpResource
manfredsteyer
PRO
0
140
Thank you <💅>, What's the Next?
ahoxa
1
590
SwiftDataのカスタムデータストアを試してみた
1mash0
0
140
파급효과: From AI to Android Development
l2hyunwoo
0
160
Qiita Bash
mercury_dev0517
2
220
note の Elasticsearch 更新系を支える技術
tchov
9
3.4k
20250429 - CNTUG Meetup #67 / DevOps Taiwan Meetup #69 - Deep Dive into Tetragon: Building Runtime Security and Observability with eBPF
tico88612
0
160
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
53
11k
The Cost Of JavaScript in 2023
addyosmani
49
7.8k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Why Our Code Smells
bkeepers
PRO
336
57k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Raft: Consensus for Rubyists
vanstee
137
6.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Code Reviewing Like a Champion
maltzj
523
40k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
A Tale of Four Properties
chriscoyier
159
23k
The Pragmatic Product Professional
lauravandoore
33
6.6k
Transcript
REASON
Matthias Le Brun twitter.com/bloodyowl github.com/bloodyowl Putain de code !
OCaml
let rec qsort = function | [] !-> [] |
pivot #:: rest !-> let is_less x = x < pivot in let left, right = List.partition is_less rest in qsort left @ [pivot] @ qsort right
Syntax isn't really friendly to newcomers
FP communities aren’t really welcoming to newcomers
None
Here comes Reason
Storytime •Initially, React was written in SML by Jordan Walke
•The idea for Reason actually predates React •Front-end community wasn’t ready yet
1. Syntax 2. Tooling 3. Ecosystem 4. Community
1. Syntax 2. Tooling 3. Ecosystem 4. Community
Functions let x a b = e let x =
fun a b !-> e OCaml Reason let x a b %=> e; let x = fun a b %=> e;
Equality a = b b '== c a #<> b
a *!= b OCaml Reason a '== b b ##=== c a *!= b a --!== b
Expressions let c = let a = "a" in let
b = "b" in a ^ b OCaml Reason let c = { let a = "a"; let b = "b"; a ^ b };
Tuples type tup = int * int let tuple =
a, b OCaml Reason type tup = (int, int) let tuple = (a, b)
Record types type rec = { foo: string; bar: string
}; OCaml Reason type rec = { foo: string, bar: string };
Records { foo = "bar"; bar = "baz" } OCaml
Reason { foo: "bar", bar: "baz", }
Lists [1; 2; 3] OCaml Reason [1, 2, 3]
Type params string option list OCaml Reason list (option string)
Variants type foo = | A of string | B
of string OCaml Reason type foo = | A string | B string
Pattern matching match a with | A x %=> "A"
^ x | B x %=> "B" ^ x OCaml Reason switch a { | A x %=> "A" ^ x | B x %=> "B" ^ x }
Equality (* comment *) OCaml Reason //* comment -*/
Refmt: one language, one formatting
ReasonFatigue prevented ☕
Syntax simpler to JS folks
1. Syntax 2. Tooling 3. Ecosystem 4. Community
BuckleScript
BuckleScript •Like js_of_ocaml but takes on after an earlier step
of compilation •Makes some optimisations considering the JS target •Great interoperability
Produces code that’s faster than vanilla™
Smaller footprint var user = //* record -*/[ //* username
-*/"Bob", //* id : Some -*/["abc"], //* age -*/32 ];
[ "Bob", ["abc"], 32 ]; Smaller footprint
Don’t want to rewrite your project from scratch?
external myExistingModule : string = [@@bs.module "-../myExistingModule"]; Use JS
type user = { name: string, age: int }; let
fromJs jsObject %=> { name: jsObject###name, age: jsObject###age }; Convert from JS
let toJs object %=> { "name": object.name, "age": object.age };
Convert to JS
{ "message_type": "image" | "string", "value": string } Complex conversions
type message = | Image string | String string; let
fromJs js %=> { switch js###message_type { | "image" %=> Image js###value | "string" | _ %=> String js###value } } Complex conversions
Lots of bindings existing/on the way
let getPageKeywords () %=> switch ( DomRe.Document.querySelector "meta[name=\"keywords\"]" DomRe.document )
{ | Some meta %=> switch (DomRe.Element.getAttribute "content" meta) { | Some content %=> Js.String.split "," content *|> Array.to_list *|> List.map String.trim | None %=> [] } | None %=> [] };
None
BetterErrors
Simpler workflow •Effort is for now a lot on the
JS back-end •Coming for native compilation
1. Syntax 2. Tooling 3. Ecosystem 4. Community
ReasonReact
ReactJS import React from "react"; import { string } from
"prop-types"; const App = props %=> ( <div> {props.message} !</div> ) App.propTypes = { message: string.isRequired };
ReasonReact let component = ReasonReact.statelessComponent "App"; let make #::message _children
%=> { …component, render: fun _ %=> <div> (ReasonReact.stringToElement message) !</div> };
ReasonReact type state = int; type actions = | Increment
| Decrement;
ReasonReact let component = ReasonReact .reducerComponent "App"; let make _
%=> { …component, reducer: fun action state %=> switch action { | Increment %=> ReasonReact.Update (state + 1) | Decrement %=> ReasonReact.Update (state - 1) }, //* … -*/ }
ReasonReact render: fun {state, reduce} %=> <div> (ReasonReact.stringToElement (string_of_int state))
<Button title="-" onClick=(reduce (fun _ %=> Increment)) 6/> !</div>
<div> (switch resource { | Loading %=> <ActivityIndicator 6/> |
Idle value %=> <Component value 6/> | Error %=> ErrorMessage.serverError }) !</div> ReasonReact
module MyType = { let name = "Type"; type t
= string; }; module MyTypeCollectionView = Primitives.FixedCollectionView.Make MyType; <MyTypeCollectionView items 6/> ReasonReact
let jsComponent = ReasonReact.wrapReasonForJs #::component (fun jsProps %=> make message#::jsProps###message
[#||] ); ReasonReact
let make #::message children %=> ReasonReact.wrapJsForReason #::reactClass props#::{"message": message} children;
ReasonReact
ReasonReact: good entry point for the front-end community
1. Syntax 2. Tooling 3. Ecosystem 4. Community
Community
Lots of meetups popping up
1. Syntax 2. Tooling 3. Ecosystem 4. Community Sum up
• A new, simpler syntax for OCaml • Lots of
efforts in improving tooling (BetterErrors, BuckleScript is a friend project) • New features like JSX • A new community (super active at the moment) • A great core team who knows what to prioritise first to make it good for everyone
Thank you! Questions?