F# Succinct, Expressive, Efficient Functional Programming for.net

Similar documents
F# Succinct, Expressive, Efficient. The F# Team Microsoft Developer Division, Redmond Microsoft Research, Cambridge

The F# Team Microsoft

Don Syme, Principal Researcher Microsoft Research, Cambridge

F# Succinct, Expressive, Functional. The F# Team Microsoft Developer Division Microsoft Research

Why is Microsoft investing in Functional Programming?

High Performance and Productivity Computing with Windows HPC George Yan. Group Manager Windows HPC Microsoft China

F# Overview: Immutable Data + Pure Func7ons

Introduction to.net, C#, and Visual Studio. Part I. Administrivia. Administrivia. Course Structure. Final Project. Part II. What is.net?

Option Values, Arrays, Sequences, and Lazy Evaluation

CSCI-GA Scripting Languages

Introduce C# as Object Oriented programming language. Explain, tokens,

Programmazione Avanzata

Tomas Petricek. F# Language Overview

C# Java. C# Types Naming Conventions. Distribution and Integration Technologies. C# C++.NET A C# program is a collection of: C C++ C# Language

Distribution and Integration Technologies. C# Language

Learning F# and the Functional Point of View. Robert Pickering, LexiFi

Programming Languages and Techniques (CIS120)

Concepts of Programming Languages

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Winter 2013

Functional Programming

Abram Hindle Kitchener Waterloo Perl Monger October 19, 2006

02157 Functional Programming. Michael R. Ha. Lecture 3: Programming as a model-based activity. Michael R. Hansen

Expert F# Don Syme, Adam Granicz, and Antonio Cisternino

CS 381: Programming Language Fundamentals

MCSA Universal Windows Platform. A Success Guide to Prepare- Programming in C# edusum.com

F# for Industrial Applications Worth a Try?

Programovací jazyky F# a OCaml. Chapter 6. Sequence expressions and computation expressions (aka monads)

CMSC 330: Organization of Programming Languages

Introduction to OCaml

Topic 1: Introduction

MF#K - Introduction to F# GroupM Mødegruppe for Ƒunktionelle Københavnere (MF#K)

Objectives. Introduce the core C# language features class Main types variables basic input and output operators arrays control constructs comments

HCIM SUMMER WORKSHOP Introduction to C#

Some Advanced ML Features

Recap: Functions as first-class values

Object-oriented programming. and data-structures CS/ENGRD 2110 SUMMER 2018

Topics Covered Thus Far CMSC 330: Organization of Programming Languages

Asynchronous Programming Model (APM) 1 Calling Asynchronous Methods Using IAsyncResult 4 Blocking Application Execution by Ending an Async Operation

The Warhol Language Reference Manual

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

CMSC 330: Organization of Programming Languages

D7020E. The dynamic evolution of a system Robust and Energy-Efficient Real-Time Systems. blocked Lecture 2: Components & the Timber language.

D7020E. Robust and Energy-Efficient Real-Time Systems D7020E. Lecture 2: Components & the Timber language

CITS 3242 Programming Paradigms Part II. Topic 10: Imperative Programming

EEE-448 COMPUTER NETWORKS (Programming) Week -6 C# & IP Programming. The StringBuilder Class. StringBuilder Classes. StringBuilder with Append

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

CS558 Programming Languages

Functional Programming and Parallel Computing

So what does studying PL buy me?

An introduction to functional programming. July 23, 2010

COS 320. Compiling Techniques

CHAPTER 1: INTRODUCING C# 3

Hierarchical inheritance: Contains one base class and multiple derived classes of the same base class.

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Fall 2011

G Programming Languages - Fall 2012

Microsoft Visual C# Step by Step. John Sharp

CS457/557 Functional Languages

CMSC330. Objects, Functional Programming, and lambda calculus

Reactive programming, WinForms,.NET. Björn Dagerman

CSC324 Principles of Programming Languages

Index. Cambridge University Press Functional Programming Using F# Michael R. Hansen and Hans Rischel. Index.

More Lambda Calculus and Intro to Type Systems

.Net Technologies. Components of.net Framework

Types, Type Inference and Unification

CS558 Programming Languages

CSCE 314 Programming Languages. Type System

CPS 506 Comparative Programming Languages. Programming Language Paradigm

SWE344. Internet Protocols and Client-Server Programming

Microsoft. Microsoft Visual C# Step by Step. John Sharp

Prerequisites: The student should have programming experience in a high-level language. ITCourseware, LLC Page 1. Object-Oriented Programming in C#

02157 Functional Programming. Michael R. Ha. Lecture 2: Functions, Types and Lists. Michael R. Hansen

Chapter 15. Functional Programming Languages

02157 Functional Programming. Michael R. Ha. Lecture 1: Introduction and Getting Started. Michael R. Hansen

Visual C# Instructor s Manual Table of Contents

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

C# Asynchronous Programming Model

CS6202: Advanced Topics in Programming Languages and Systems Lecture 0 : Overview

CSCE 110 PROGRAMMING FUNDAMENTALS

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

Chapter 15. Functional Programming Languages

3. Basic Concepts. 3.1 Application Startup

Chapter 1 Getting Started

Chapter 2: Using Data

02157 Functional Programming Lecture 1: Introduction and Getting Started

CSCI 2041: Basic OCaml Syntax and Features

Introduction to ML. Mooly Sagiv. Cornell CS 3110 Data Structures and Functional Programming

CS 11 Ocaml track: lecture 3

CMSC 330: Organization of Programming Languages. Rust Basics

Outline. What is semantics? Denotational semantics. Semantics of naming. What is semantics? 2 / 21

CS 565: Programming Languages. Spring 2008 Tu, Th: 16:30-17:45 Room LWSN 1106

OCaml. ML Flow. Complex types: Lists. Complex types: Lists. The PL for the discerning hacker. All elements must have same type.

C#: framework overview and in-the-small features

Programovací jazyky F# a OCaml. Chapter 5. Hiding recursion using function-as-values

CS 112 Introduction to Computing II. Wayne Snyder Computer Science Department Boston University

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

Programming language design and analysis

The Substitution Model. Nate Foster Spring 2018

Dialects of ML. CMSC 330: Organization of Programming Languages. Dialects of ML (cont.) Features of ML. Functional Languages. Features of ML (cont.

Duhok Polytechnic University Amedi Technical Institute/ IT Dept. Halkawt Rajab Hussain

Course Hours

Transcription:

F# Succinct, Expressive, Efficient Functional Programming for.net The F# Team Microsoft Developer Division, Redmond Microsoft Research, Cambridge Topics What is F# about? Some Simple F# Programming A Taste of Parallel/Reactive with F# TLA405 1

F#: Combining Paradigms Functional Objects.NET Tools Strong Typing Succinct.NET OO Model Visual Studio Libraries F# Compiler F# Interactive Type Inference Data Types and Patterns 1 st Class Functions Meta- Programming Interoperable Compact typeinferred classes Tools Concurrency LINQ Visual Studio Integration Math/Plot Bindings Lex and Yacc F#: The Combination Counts! Scalable Libraries Explorative Succinct Interoperable Statically Typed F# Efficient TLA405 2

F#: Combining Paradigms I've been coding in F# lately, for a production task. F# allows you to move smoothly in your programming style... I start with pure functional code, shift slightly towards an object-oriented style, and in production code, I sometimes have to do some imperative programming. I can start with a pure idea, and still finish my project with realistic code. You're never disappointed in any phase of the project! Julien Laugel, Chief Software Architect, www.eurostocks.com F#: Influences OCaml F# C#/.NET Similar core language Similar object model TLA405 3

The Path to Mastering F# Topic Scoping and let Tuples Pattern Matching Working with Functions Sequences, Lists, Options Records and Unions Basic Imperative Programming Basic Objects and Types The F# Libraries Advanced Functional/Imperative Advanced Functional/OO Language Oriented Programming Parallel and Asynchronous Covered Today (later) (later) Quick Tour // comment Comments (* comment *) /// XML doc comment let x = 1 TLA405 4

Quick Tour Overloaded Arithmetic x + y Addition x - y Subtraction x * y Multiplication x / y Division x % y Remainder/modulus -x Unary negation Booleans not expr Boolean negation expr && expr Boolean and expr expr Boolean or Quick Tour: Types Basic Types and Literals Basic Type Abbreviations sbyte = System.SByte 76y int8 = sbyte byte = System.Byte 76uy uint8 = byte int16 = System.Int16 76s int = int32 uint16 = System.UInt16 76us int32 = System.Int32 76 float32 = single uint32 = System.UInt32 76u int64 = System.Int64 76L float = double uint64 = System.UInt64 76UL string = System.String "abc", @"c:\etc" single = System.Single 3.14f double = System.Double 3.14, 3.2e5 char = System.Char '7' nativeint = System.IntPtr 76n unativeint = System.UIntPtr 76un bool = System.Boolean true, false unit = Microsoft.FSharp.Core.Unit () TLA405 5

Orthogonal & Unified Constructs Let let simplify your life Bind a static value let data = (1,2,3) Type inference. The safety of C# with the succinctness of a scripting language Bind a static function Bind a local value let f(a,b,c) = let sum = a + b + c let g(x) = sum + x*x g(a), g(b), g(c) Bind a local function Demo: Let s WebCrawl TLA405 6

Orthogonal & Unified Constructs Functions: like delegates + unified and simple (fun x -> x + 1) let f(x) = x + 1 (f,f) val f : int -> int One simple mechanism, Anonymous predicate = 'a -> bool many Function value uses send = 'a -> unit Declare a function threadstart value = unit -> unit A pair of function comparer values = 'a -> 'a -> int hasher = 'a -> int A function type equality = 'a -> 'a -> bool F# - Functional let f x = x+1 let pair x = (x,x) let fst (x,y) = x let data = (Some [1;2;3], Some [4;5;6]) match data with Some(nums1), Some(nums2) -> nums1 @ nums2 None, Some(nums) -> nums Some(nums), None -> nums None, None -> failwith "missing!" TLA405 7

F# - Functional List.map Seq.fold Range Array.filter Lazy.force Expressions Set.union Map LazyList Events Async... List via query [ 0..1000 ] [ for x in 0..10 -> (x, x * x) ] [ for x in 0..10 -> (x, x * x) ] seq { for x in 0..10 -> (x, x * x) } Array via query IEnumerable via query F# - Functional + Queries SQL <@ { for customer in db.customers do for employee in db.employees do if customer.name = employee.name then yield (customer.name, employee.address) } @> LINQ SQLMetal SQL : Expr<seq<'a>> -> seq<'a> SQL Database TLA405 8

Immutability the norm Data is immutable by default Values may not be changed Not Mutate Copy & Update In Praise of Immutability Immutable objects can be relied upon Immutable objects can transfer between threads Immutable objects can be aliased safely Immutable objects lead to (different) optimization opportunities TLA405 9

F# - Imperative + Functional open System.Collections.Generic let dict = new Dictionary<int,string>(1000) dict.[17] <- "Seventeen" dict.[1000] <- "One Grand" Using.NET collections for (KeyValue(k,v)) in dict do printfn "key = %d, value = %s" k v F# - Imperative + Functional use = C# using open System.IO open System.Collections.Generic let readalllines(file) = use inp = File.OpenText file let res = new List<_>() while not(inp.endofstream) do res.add(inp.readline()) res.toarray() TLA405 10

F# - Sequences Sequence Expressions and On -demand I/O open System.IO let rec allfiles(dir) = seq { for file in Directory.GetFiles(dir) do yield file for sub in Directory.GetDirectories(dir) do yield! allfiles(sub) } allfiles(@"c:\windows") > Seq.take 100 > show Weakly Typed? Slow? //F# #light open System let a = 2 Console.WriteLine(a) //C# using System; namespace ConsoleApplication1 { class Program { static int a() { return 2; } Looks Weakly typed? Maybe Dynamic? } } static void Main(string[] args) { Console.WriteLine(a); } TLA405 11

F# Yet Typed rich, dynamic Efficient Yet succinct Untyped Interpreted Reflection Invoke F# - Imperative + Functional Read lines on demand open System.IO let alllines = seq { use inp = File.OpenText "test.txt" while not(inp.endofstream) do yield (inp.readline()) } Pipelines alllines > Seq.truncate 1000 > Seq.map (fun s -> uppercase s,s) > Seq.to_array TLA405 12

F# - Objects + Functional type Vector2D(dx:double,dy:double) = member v.dx = dx member v.dy = dy Inputs to object construction Exported properties member v.length = sqrt(dx*dx+dy*dy) member v.scale(k) = Vector2D(dx*k,dy*k) Exported method F# - Objects + Functional type Vector2D(dx:double,dy:double) = let norm2 = dx*dx+dy*dy Internal (precomputed) values and functions member v.dx = dx member v.dy = dy member v.length = sqrt(norm2) member v.norm2 = norm2 TLA405 13

F# - Objects + Functional Immutable inputs type HuffmanEncoding(freq:seq<char*int>) =... < 50 lines of beautiful functional code>... Internal tables member x.encode(input: seq<char>) = encode(input) member x.decode(input: seq<char>) = decode(input) Publish access F# - Objects + Functional type Vector2D(dx:double,dy:double) = let mutable currdx = dx Internal state let mutable currdx = dy member v.dx = currdx member v.dy = currdy member v.move(x,y) = currdx <- currdx+x currdy <- currdy+y Publish internal state Mutate internal state TLA405 14

F# - Language Oriented type PropLogic = And of PropLogic * PropLogic Not of PropLogic True let rec Eval(prop) = match prop with And(a,b) -> Eval(a) && Eval(b) Not(a) -> not (Eval(a)) True -> true Embedded Language Crisp Semantics F# - What s it For? Language: Math like, succinct, functional Users have a mathematical background Shun infrastructure and boilerplate Quality: Performant, scalable, reliable, supported Live and mission critical apps Huge data loads Tool: Explorative, interactive, connected On the cutting edge, working in uncharted territory Experimentation and tuning are important Acquire and analyze multiple data sources.net Libraries: HPC, Concurrency Heavy on computation, analysis, prediction, parallelism 30 12/07/2007 TLA405 15

Demo: 3D Visualization Case Study The adpredict Competition TLA405 16

The adcenter Problem Cash-cow of Search Selling web space at www.live.com and www.msn.com. Paid Search (prices by auctions) The internal competition focuses on Paid Search. The Scale of Things Weeks of data in training: 7,000,000,000 impressions, 6TB data 2 weeks of CPU time during training: 2 wks 7 days 86,400 sec/day = 1,209,600 seconds Learning algorithm speed requirement: 5,787 impression updates / sec 172.8 µs per impression update TLA405 17

F# and adcenter 4 week project, 4 machine learning experts 100million probabilistic variables Processes 6TB of training data Real time processing AdPredict: What We Observed F# s powerful type inference means less typing, more thinking Quick Coding Agile Coding Scripting Performance Memory-Faithful Succinct Symbolic.NET Integration Type-inferred code is easily refactored Hands-on exploration. Immediate scaling to massive data sets mega-data structures, 16GB machines Live in the domain, not the language Schema compilation and Schedules Especially Excel, SQL Server TLA405 18

F# - Concurrent/Reactive/Parallel Concurrent: Multiple threads of execution Parallel: These execute simultaneously Asynchronous: Computations that complete "later" Reactive: Waiting and responding is normal Why is it so hard? To get 50 web pages in parallel? To get from thread to thread? To create a worker thread that reads messages? To handle failure on worker threads? TLA405 19

Why isn t it this easy? let ProcessImages() = Async.Run (Async.Parallel [ for i in 1.. numimages -> ProcessImage(i) ]) Why isn t it this easy? let task = async {... do! SwitchToNewThread()... do! SwitchToThreadPool()... do! SwitchToGuiThread()... } TLA405 20

Some Foundation Technologies.NET/Win32 Threads System.Threading.NET Thread Pool.NET BackgroundWorker and SynchronizationContexts Parallel Extensions for.net F# - Concurrent/Reactive/Parallel Concurrent: Multiple threads of execution Parallel: These execute simultaneously Asynchronous: Computations that complete "later" Reactive: Waiting and responding is normal TLA405 21

Taming Asynchronous I/O Target: make it easy to use Begin/End operations Stream.BeginRead :... Stream.EndRead : IAsyncResult *... Taming Asynchronous I/O Typical Control Flow Compositional thread-hopping? BeginRead EndRead Rest of Task TLA405 22

Taming Asynchronous I/O ReadAsync Rest of Task Simple Examples Compute 22 and 7 in parallel Async.Parallel [ async { -> 2*2 + 3*6 }; async { -> 3 + 5-1 } ] Get these three web pages and wait until all have Async.Parallel [WebRequest.Async "http://www.live.com"; come back WebRequest.Async "http://www.yahoo.com"; WebRequest.Async "http://www.google.com" ] let pararrmap f (arr: _[]) = Async.Run (Async.Parallel [ for x in arr -> async { -> f x } ]) Naive Parallel Array Map TLA405 23

Taming Asynchronous I/O using System; using System.IO; using System.Threading; public static void ReadInImageCallback(IAsyncResult asyncresult) { public static void ProcessImagesInBulk() public class BulkImageProcAsync ImageStateObject state = (ImageStateObject)asyncResult.AsyncState; { { Stream stream = state.fs; Console.WriteLine("Processing images... "); public const String ImageBaseName = "tmpimage-"; int bytesread = stream.endread(asyncresult); long t0 = Environment.TickCount; public const int numimages = 200; if (bytesread!= numpixels) NumImagesToFinish = numimages; public const int numpixels = 512 * 512; throw new Exception(String.Format AsyncCallback readimagecallback = new ("In ReadInImageCallback, got the wrong number of " + AsyncCallback(ReadInImageCallback); // ProcessImage has a simple O(N) loop, and you can "bytes vary from the number the image: {0}.", bytesread)); for (int i = 0; i < numimages; i++) // of times you repeat that loop to make the ProcessImage(state.pixels, application more CPU- state.imagenum); { // bound or more IO-bound. stream.close(); ImageStateObject state = new ImageStateObject(); public static int processimagerepeats = 20; state.pixels = new byte[numpixels]; // Now write out the image. state.imagenum = i; // Threads must decrement NumImagesToFinish, // Using and protect asynchronous I/O here appears not to be best practice. // Very large items are read only once, so you can make the // their access to it through a mutex. // It ends up swamping the threadpool, because the threadpool // buffer on the FileStream very small to save memory. public static int NumImagesToFinish = numimages; // threads are blocked on I/O requests that were just queued to FileStream fs = new FileStream(ImageBaseName + i + ".tmp", public static Object[] NumImagesMutex = new // Object[0]; the threadpool. FileMode.Open, FileAccess.Read, FileShare.Read, 1, true); // WaitObject is signalled when all image FileStream processing fs is = done. new FileStream(ImageBaseName + state.imagenum + state.fs = fs; public static Object[] WaitObject = new Object[0]; ".done", FileMode.Create, FileAccess.Write, FileShare.None, fs.beginread(state.pixels, 0, numpixels, readimagecallback, public class ImageStateObject 4096, false); state); { fs.write(state.pixels, 0, numpixels); } public byte[] pixels; fs.close(); public int imagenum; // Determine whether all images are done being processed. public let ProcessImageAsync FileStream fs; () = // This application model uses too much memory. // If not, block until all are finished. } async { let instream = File.OpenRead(sprintf // Releasing memory "Image%d.tmp" as soon as i) possible is a good idea, bool mustblock = false; let! pixels = instream.readasync(numpixels) // especially global state. lock (NumImagesMutex) let pixels' = TransformImage(pixels,i) state.pixels = null; { let outstream = File.OpenWrite(sprintf fs = null; "Image%d.done" i) if (NumImagesToFinish > 0) do! outstream.writeasync(pixels') // Record that an image is finished now. mustblock = true; do Console.WriteLine "done!" lock (NumImagesMutex) } } { if (mustblock) let ProcessImagesAsyncWorkflow() = NumImagesToFinish--; { parallel Async.Run (Async.Parallel if (NumImagesToFinish == 0) Console.WriteLine("All worker threads are queued. " + [ for i in 1.. numimages { -> ProcessImageAsync i ]) " Blocking until they complete. numleft: {0}", Monitor.Enter(WaitObject); NumImagesToFinish); Monitor.Pulse(WaitObject); Monitor.Enter(WaitObject); Monitor.Exit(WaitObject); Monitor.Wait(WaitObject); } Monitor.Exit(WaitObject); } } } long t1 = Environment.TickCount; Console.WriteLine("Total time processing images: {0}ms", (t1 - t0)); } } Processing 200 images in 8 Ways to Learn FSI.exe Samples Included Go to definition Lutz Reflector http://cs.hubfs.net Codeplex Fsharp Samples Books ML TLA405 24

Books about F# Visit http://research.microsoft.com/fsharp http://blogs.msdn.com/dsyme Getting F# Spring Refresh just released (1.9.4) Focus on Simplicity, Regularity, Correctness CTP: Late Summer And then onwards towards Visual Studio Next TLA405 25

Questions & Discussion 2007 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. TLA405 26