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
PureScript
Search
Brian McKenna
May 19, 2014
Programming
590
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PureScript
For Full Stack Boulder.
Brian McKenna
May 19, 2014
More Decks by Brian McKenna
See All by Brian McKenna
Production PureScript
puffnfresh
0
130
Boulder Startup Week: What is functional programming?
puffnfresh
0
70
LambdaConf: Idris Workshop
puffnfresh
2
140
Other Decks in Programming
See All in Programming
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
200
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3k
Foundation Models frameworkで画像分析
ryodeveloper
1
130
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
120
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
350
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
数百円から始めるRuby電子工作
tarosay
0
100
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
240
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Navigating Team Friction
lara
192
16k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
Balancing Empowerment & Direction
lara
6
1.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
How to Ace a Technical Interview
jacobian
281
24k
Git: the NoSQL Database
bkeepers
PRO
432
67k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Transcript
None
Goals
· Writing JavaScript · Functional programming · Small output ·
Small language
Transpilers Are Awesome
· Compile step! · ES6 is bad! · Small output,
take output and forget
Resources
· purescript.org · try.purescript.org · purescript.readthedocs.org
Types
data Person = Person String Number sayHello :: Person ->
String sayHello (Person name age) = "Hello " ++ name ++ ", you are " ++ show age ++ " years old"
var PS = PS || {}; PS.Person = (function ()
{ "use strict"; var Prelude = PS.Prelude; var Person = function (value0) { return function (value1) { return { ctor: "Person.Person", values: [ value0, value1 ] }; }; }; var sayHello = function (_1) { return "Hello " + _1.values[0] + ", you are " + Prelude.show(Prelude.showNumber({}))(_1.values[1]) + " years old"; }; return { Person: Person, sayHello: sayHello }; })();
var brian = PS.Person.Person("Brian")(24); console.log(PS.Person.sayHello(brian));
Extensible records
addXY :: forall r. { x :: Number, y ::
Number | r } -> Number addXY o = o.x + o.y -- Error: Object does not have property y -- x :: Number -- x = addXY { x: 1 } xy :: Number xy = addXY { x: 1, y: 2 } xyz :: Number xyz = addXY { x: 1, y: 2, z: 3 }
Interoperating
foreign import showBool "function showBool(b) {\ \ return b.toString();\ \}"
:: Boolean -> String
Type classes
class ToString s where toString :: s -> String instance
boolTS :: ToString Boolean where toString = showBool instance numberTS :: ToString Number where toString = showNumber main = trace (toString true ++ toString 10)
Tools
· npm · Grunt/Gulp · Bower
module.exports = function(grunt) { grunt.initConfig({ libFiles: [ "src/**/*.purs", "bower_components/purescript-*/src/**/*.purs", ],
clean: ["output"], pscMake: ["<%=libFiles%>"], dotPsci: ["<%=libFiles%>"], docgen: { readme: { src: "src/**/*.purs", dest: "README.md" } } }); grunt.loadNpmTasks("grunt-contrib-clean"); grunt.loadNpmTasks("grunt-purescript"); grunt.registerTask("make", ["pscMake", "dotPsci", "docgen"]); grunt.registerTask("default", ["make"]); };
{ "name": "purescript-streams", "homepage": "https://github.com/purescript-contrib/purescript-streams", "description": "Compositional, streaming I/O library",
"keywords": [ "purescript" ], "license": "MIT", "ignore": [ "**/.*", "bower_components", "node_modules", "output", "tests", "tmp", "bower.json", "Gruntfile.js", "package.json" ], "dependencies": { "purescript-monoid": ">=0.1.1", "purescript-tuples": "*", "purescript-task": "*" } }
Libraries
· purescript-react · purescript-reactive · purescript-canvas · purescript-jquery · purescript-quickcheck
· purescript-streams
counter = mkUI spec { getInitialState = return 0 }
do val <- readState return $ DOM.p { className: "Counter", onClick: handle incrementCounter } [ DOM.text (show val), DOM.text " Click me to increment!" ]
testConst :: Number -> Number -> Number -> Boolean testConst
a b c = const a b == const a c main :: Eff (trace :: Trace) {} main = quickCheck testConst
None
snowflake :: Number -> Drawing snowflake n = go <<<
go <<< go $ circle where go = everywhere replace replace (Arc { cx = cx, cy = cy, r = r }) = Composite $ flip map (range 0 (n - 1)) $ \i -> let theta = i / n * Math.pi * 2 in Arc { cx: cx + r * 0.7 * Math.sin theta , cy: cy + r * 0.7 * Math.cos theta , r: r * 0.3 , start: 0 , end: Math.pi * 2 } replace other = other
sayHello :: Process (Task (trace :: Trace)) {} sayHello =
await (traceTask "Hello") (const Halt) main :: Eff (trace :: Trace) {} main = runTask (Process.run (repeatedly sayHello))
· purescript.org · try.purescript.org · purescript.readthedocs.org