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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
120
Boulder Startup Week: What is functional programming?
puffnfresh
0
68
LambdaConf: Idris Workshop
puffnfresh
2
130
Other Decks in Programming
See All in Programming
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
710
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
10
3.2k
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
110
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.7k
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
ふつうのFeature Flag実践入門
irof
7
3.7k
OSもどきOS
arkw
0
540
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.5k
技術記事、 専門家としてのプログラマ、 言語化
mizchi
12
4.7k
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
Featured
See All Featured
Crafting Experiences
bethany
1
180
My Coaching Mixtape
mlcsv
0
140
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
WCS-LA-2024
lcolladotor
0
630
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
A Soul's Torment
seathinner
6
2.9k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
230
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