34
Applying Functional Programming to Build Platform-Independent Mobile Applications Adam Granicz, CEO IntelliFactory [email protected] om Copyright © 2004-2011 IntelliFactory http:// www.intellifactory.com Platform-Independent Mobile Applications CUFP 2011, Tokyo, Japan - Sep 24, 2011

Applying Functional Programming to Build Platform-Independent Mobile Applications

  • Upload
    granicz

  • View
    733

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Applying Functional Programming to Build Platform-Independent Mobile Applications

Applying Functional Programming to Build Platform-Independent Mobile Applications

Adam Granicz, CEO IntelliFactory

[email protected]

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com

Platform-Independent Mobile Applications

CUFP 2011, Tokyo, Japan - Sep 24, 2011

Page 2: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

It’s all about business

The mobile market†

• 3.7 billion mobile users• $1.2 trillion dollars generated:

the fastest growing industry on the planet• $8.8 billion on mobile advertising

• $3 billion spent on consumer apps• $6 billion spent on corporate applications• Expected to rise sharply

† source: http://communities-dominate.blogs.com/brands/2011/02/all-the-numbers-all-the-facts-on-mobile-the-trillion-dollar-industry-why-is-google-saying-put-your-b.html

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 2

Page 3: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

It’s all about business

Reaching prospects via mobiles†

† source: http://mashable.com/2011/02/24/mobile-app-dev-cost/

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 3

Channel Cost Reach People/$

Mobile website $30,000 36.40% 2,840

iPhone app $30,000 6.75% 527

Mobile app for major brands $90,000 24.04% 599

Page 4: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Mobile development now – not looking good

• iOS – Objective-C hell + pinned to Macs + pinned to custom development environment and tools

• Android – Java + a large API to learn• Windows Phone - .NET + a large API to learn• Windows Mobile - …

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 4

Page 5: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Mobile development now – not looking good

• Can we multi-target?– Not easily, in fact it’s nearly impossible without

rewriting code from one language to another

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 5

Page 6: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

What do we need?

What would get people really excited?

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 6

Page 7: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

What do we need?

How about some of the following:– Writing less code– Using higher level abstractions– Type-safe, declarative UIs– Multi-targeting– Scaling into desktop applications– Scaling into the cloud

Tremendous saving on time/effort/maintainability

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 7

Page 8: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Native apps vs Web apps

• JavaScript is the IL …– of client-side web applications

and is becoming the IL …

– of desktop applications: Windows 8– of mobile applications: Android, WP7, etc.

• Some even write the server side in JavaScript

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 8

Page 9: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

JavaScript-based mobile applications

• So let’s write mobile applications in JavaScript!

• Hey, but we have PhoneGap and all, what about that?– Sure, but JavaScript is hard to write, we need:

• Type safety• Compile time guarantees• Coding assistance – code completion, API help, etc.

– We still have N-1 unfulfilled objectives

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 9

Page 10: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper

• Mature, enterprise-ready framework• Write all your server+client code in F#• Compiles to a complete web application• Interface with any client-side JS library via F#• Powerful abstractions• Automatic resource management• Safe URLs, type-safe URLs• and much-much more…

Less code (50-90% less!)Quicker to developEasier to maintain

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 10

Page 11: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper Mobile

• Exposes mobile capabilities to JavaScript• Provides the necessary packaging• Enables quick and seamless multi-

targeting• Scales into the cloud

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 11

Page 12: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper extensions

A couple dozen available extensions

http://websharper.com/extensions

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 12

Page 13: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Powerful Abstractions - Sitelets

• Type-safe• Composable• First-class

Parameterized over a union type:

/// Actions that correspond to the different pages in the site.type Action = | Home | Contact | Protected | Login of option<Action> | Logout | Echo of string

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 13

Page 14: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets

let Template title main : Content<Action> = let menu (ctx: Context<Action>)= let (!) action = ctx.Link action |> HRef

[ A [!Action.Home] -< [Text "Home"] A [!Action.Contact] -< [Text "Contact"] A [!(Action.Echo "Hello“)] -< [Text "Say Hello"] A ["~/LegacyPage.aspx" |> ctx.ResolveUrl |> HRef] -< [Text "ASPX Page"] ] |> List.map (fun link -> Label [Class "menu-item"] -< [link] )

Templates.Skin.Skin (Some title)

{ LoginInfo = Widgets.LoginInfo Banner = fun ctx -> [H2 [Text title]] Menu = menu Main = main Sidebar = fun ctx -> [Text "Put your side bar here"] Footer = fun ctx -> [Text “Copyright (c) 2011 YourCompany.com"] }

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 14

Strongly-typed templating, safe URLs

Page 15: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets

/// The pages of this website.module Pages =

/// A helper function to create a hyperlink let ( => ) title href = A [HRef href] -< [Text title]

/// The home page. let HomePage : Content<Action> = Template "Home" <| fun ctx -> [ H1 [Text "Welcome to our site!"] “Contact" => ctx.Link Action.Contact ] ...

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 15

Page 16: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets – composing 1

// A simple sitelet for the root of the site.let home = Sitelet.Content "/" Action.Home Pages.HomePage

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 16

Page 17: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets – composing 2

// An automatically inferred sitelet for the basic parts.let basic = Sitelet.Infer <| fun action -> match action with | Action.Contact -> Pages.ContactPage | Action.Echo param -> Pages.EchoPage param | Action.Login action -> Pages.LoginPage action | Action.Logout -> // Logout user and redirect to home UserSession.Logout () Content.Redirect Action.Home | Action.Home -> Content.Redirect Action.Home | Action.Protected -> Content.ServerError

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 17

Page 18: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets – composing 3

// A sitelet for the protected content.let authenticated = let filter : Sitelet.Filter<Action> = { VerifyUser = fun _ -> true LoginRedirect = Some >> Action.Login }

Sitelet.Protect filter <| Sitelet.Content "/protected“ Action.Protected Pages.ProtectedPage

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 18

Page 19: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper sitelets – composing final

let EntireSite = // Compose the above sitelets into a larger one. Sitelet.Sum [ home authenticated basic ]

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 19

Page 20: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Powerful abstractions - Formlets

• Type-safe• Composable• First-class

• Dependent formlets – can express dependencies

• Flowlets – provide step-by-step layout

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 20

Page 21: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlets

let TB label msg = Controls.Input "" |> Validator.IsNotEmpty msg |> Enhance.WithValidationIcon |> Enhance.WithTextLabel label

Formlet.Yield (fun v1 v2 ... vn -> <compose all vi’s>)

<*> formlet1

<*> formlet2

...<*> formletn

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 21

Page 22: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlets

type Person = { Name: string; Email: string }

[<JavaScript>]let PersonFormlet () : Formlet<Person> = let nameF = TB “Name” “Empy name not allowed” let emailF = TB “Email” “Please enter a valid email address”

Formlet.Yield (fun name email -> { Name = name; Email = email }) <*> nameF <*> emailF |> Enhance.WithSubmitAndResetButtons |> Enhance.WithLegend "Add a New Person“ |> Enhance.WithFormContainer

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 22

Page 23: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlets

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 23

And you get:

Page 24: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlet extensions

• Available for various UI control set libraries– jQuery UI– Yahoo UI– Ext JS– jQuery Mobile

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 24

Page 25: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlet extensions - jQM

let loginSequenceF = Formlet.Do { let! username, password, remember = Formlet.Yield (fun user pass remember -> user, pass, remember) <*> (Controls.TextField "" Theme.C "Username: " |> Validator.IsNotEmpty "Username cannot be empty!") <*> (Controls.Password "" Theme.C "Password: " |> Validator.IsRegexMatch "^[1-4]{4,}[0-9]$" "The password is wrong!") <*> Controls.Checkbox true Theme.C "Keep me logged in " |> Enhance.WithSubmitButton "Log in" Theme.C let rememberText = if remember then "" else "not " do! Formlet.OfElement (fun _ -> Div [ H3 [Text ("Welcome " + username + "!")] P [Text ("We will " + rememberText + "keep you logged in.")] ]) } |> Formlet.Flowlet

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 25

Page 26: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlet extensions - jQM

Div [HTML5.Attr.Data "role" "page"] -< [ Div [HTML5.Attr.Data "role" "header"] -< [ H1 [Text "WebSharper Formlets for jQuery Mobile"]> ]

Div [HTML5.Attr.Data "role" "content"] -< [

loginSequenceF

]

Div [HTML5.Attr.Data "role" "footer"] -< [ P [Attr.Style "text-align: center;"] -< [Text "IntelliFactory"] ]]

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 26

Page 27: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

WebSharper formlet extensions - jQM

As you expect:

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 27

Page 28: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Other extensions

• GIS– Google Maps– Bing Maps

• Visualization– Infovis– Protovis– Google Visualization

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 28

Page 29: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Other extensions – Google Maps

type CurrentLocationControl() = inherit Web.Control()

[<JavaScript>] override this.Body = let screenWidth =

JQuery.Of("body").Width()

let MapOptions = Bing.MapViewOptions( Credentials = bingMapsKey, Width = screenWidth - 10, Height = screenWidth - 10, Zoom = 16)

let label = H2 []

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 29

let map = Div [] |>! OnAfterRender (fun this -> // Renders a map control let map =

Bing.Map(this.Body, MapOptions) map.SetMapType(Bing.MapTypeId.Road) setMap map)

// Returns markup for this control Div [ label Br [] map ] :> _

let setMap (map : Bing.Map) = let updateLocation() = // Gets the current location let loc = Mobile.GetLocation() // Sets the label to the current location Rest.RequestLocationByPoint(<<your-bingmaps-

key>>, loc.Lat, loc.Long, ["Address"],

fun result -> let locInfo =

result.ResourceSets.[0].Resources.[0] label.Text <-

"You are currently at " + JavaScript.Get "name" locInfo)

// Adds a pushpin at the current location let loc = Bing.Location(loc.Lat, loc.Long) let pin = Bing.Pushpin loc map.Entities.Clear() map.Entities.Push pin map.SetView(Bing.ViewOptions(Center = loc))

// Keep updating your location regularly JavaScript.SetInterval updateLocation 1000 |> ignore

Page 30: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Other extensions – Google Maps

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 30

Page 31: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Other extensions

• HTML5– WebGL– O3D– GlMatrix

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 31

Page 32: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Summary

F# + WebSharper gives:• Absolutely huge productivity gain• Access to a growing market opportunity• Quick path to multiple platforms• Scaling to desktop and to the cloud

Advocates functional programming to– Use more powerful abstractions– Cut development time– Produce shorter, more maintainable code

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 32

Page 33: Applying Functional Programming to Build Platform-Independent Mobile Applications

Platform-Independent Mobile Applications

Extra

FPish.net - “everything functional”:• Events – webcasts, meetups, etc.• Courses• User groups• Conferences• Blogs• Topics – Q&A• Developers• Companies

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com | 33

Page 34: Applying Functional Programming to Build Platform-Independent Mobile Applications

Questions?

Find out more at:http://intellifactory.com

http://websharper.comhttp://infoq.com/articles/

WebSharper

Copyright © 2004-2011 IntelliFactory

http://www.intellifactory.com

Platform-Independent Mobile Applications

CUFP 2011, Tokyo, Japan - Sep 24, 2011