39
Frege purely functional programming on the JVM JFocus 2016

Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Fregepurely functional programming

on the JVM

JFocus 2016

Page 2: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Dierk König canoo

mittie

Page 3: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Why do we care?a=1

b=2

c=b

b=a

a=c

1

1 2

1 2

2

1

1

22

1 2

time1time2time3

place1 place2 place3

Page 4: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Operational Reasoninga=1

b=2

c=b

b=a

a=c

1

1 2

1 2 2

1 1 2

2 1 2

time1time2time3

place1 place2 place3

We need a debugger!

Page 5: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Using functionsa=1

b=2

1

1 2

Page 6: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Using functionsa=1

b=2

1

1 2

2 1

swap(a,b)=(b,a)

Page 7: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Let’s just program without

assignments or statements!

Page 8: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Developer Discipline

Pure Functional Language

Page 9: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Online REPL try.frege-lang.org

Page 10: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Define a Functionfrege>timesab=a*b

frege>times23

6

frege>:typetimes

Numα=>α->α->α

Page 11: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Define a Functionfrege>timesab=a*b

frege>(times2)3

6

frege>:typetimes

Numα=>α->(α->α)

no types declared

function appl. left associative

typeclass constraint

only 1 parameter!

return type is a function!

thumb: „two params of same numeric type returning that type“

no comma

Page 12: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Reference a Functionfrege>twotimes=times2

frege>twotimes3

6

frege>:ttwotimes

Int->Int

Page 13: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Reference a Functionfrege>twotimesx=times2x

frege>twotimes3

6

frege>:ttwotimes

Int->Int

No second arg!

„Currying“, „schönfinkeling“, or „partial function

application“. Concept invented by

Gottlob Frege.

inferred types are more specific

Page 14: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Function Compositionfrege>sixx=twotimes(threetimesx)

frege>sixx=(twotimes.threetimes)x

frege>six=twotimes.threetimes

frege>six2

12

Page 15: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Function Compositionfrege>sixx=twotimes(threetimesx)

frege>sixx=(twotimes.threetimes)x

frege>six=twotimes.threetimes

frege>six2

12

f(g(x))

(f ° g) x

f ° g

Page 16: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Pure FunctionsJava

Tfoo(Pair<T,U>p){…}

Frege

foo::(α,β)->α

What could possibly happen?

What could possibly happen?

Page 17: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Pure FunctionsJava

Tfoo(Pair<T,U>p){…}

Frege

foo::(α,β)->α

Everything! State changes,

file or db access, missile launch,…

a is returned

Page 18: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

can be cached (memoized) can be evaluated lazily can be evaluated in advance can be evaluated concurrently can be eliminated in common subexpressions

can be optimized

Pure Functions

Page 19: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Is my method pure?

Let the type system find out!

Page 20: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Java Interoperability

Do not mix OO and FP,

combine them!

Page 21: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Java -> FregeFrege compiles Haskell to Java source and byte code.

Just call that.

You can get help by using the :java command in the REPL.

Page 22: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

pure native encode java.net.URLEncoder.encode :: String -> String encode “Dierk König“

native millis java.lang.System.currentTimeMillis :: () -> IO Long millis () millis () past = millis () - 1000

Does not compile!

Frege -> Java

This is a key distinction between Frege and other JVM languages!

even Java can be pure

Page 23: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

allows calling Java but never unprotected!

is explicit about effects just like Haskell

Frege

Prerequisite to safe concurrency and deterministic parallelism!

Page 24: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Mutable I/O

Mutable

Mutable

Keep the mess out!

Pure Computation

Pure Computation

Pure Computation

Page 25: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Mutable I/O

Mutable

Mutable

Keep the mess out!

Pure Computation

Pure Computation

Pure Computation

Ok, these are Monads. Be brave. Think of them as contexts that the type system propagates and makes un-escapable.

Thread-safe by design! Checked

by compiler

Page 26: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Type SystemGlobal type inference

More safety and less work for the programmer

You don’t need to specify any types at all! But sometimes you do for clarity.

Page 27: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Pure Transactions

Page 28: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Type inference FTW

Page 29: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Fizzbuzzhttp://c2.com/cgi/wiki?FizzBuzzTest

https://dierk.gitbooks.io/fregegoodness/ chapter 8 „FizzBuzz“

Page 30: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Fizzbuzz ImperativepublicclassFizzBuzz{publicstaticvoidmain(String[]args){for(inti=1;i<=100;i++){if(i%15==0{System.out.println(„FizzBuzz");}elseif(i%3==0){System.out.println("Fizz");}elseif(i%5==0){System.out.println("Buzz");}else{System.out.println(i);}}}}

Page 31: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Fizzbuzz Logicalfizzes=cycle["","","fizz"]buzzes=cycle["","","","","buzz"]pattern=zipWith(++)fizzesbuzzesnumbers=mapshow[1..]fizzbuzz=zipWithmaxpatternnumbers

main_=for(take100fizzbuzz)println

Page 32: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Fizzbuzz ComparisonImperative Logical

Conditionals 4 0

Operators 7 1

Nesting level 3 0

Sequencing sensitive transparent

Maintainability - - - +

Incremental development - +++

Page 33: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Unique in FregeGlobal type inference (requires purity)Purity by default effects are explicit in the type systemType-safe concurrency & parallelismLaziness by defaultValues are always immutable Guarantees extend into Java calls

Page 34: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Why FregeRobustness under parallel execution Robustness under composition Robustness under incrementsRobustness under refactoring

Enables local and equational reasoning

Best way to learn FP

Page 35: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Why Frege

it is just a pleasure to work with

Page 36: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

How?http://www.frege-lang.org@fregelangstackoverflow „frege“ tagedX FP101 MOOC

Page 37: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Dierk König canoo

mittie

Please give feedback!

Page 38: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

FGALanguage level is Haskell Report 2010.Yes, performance is roughly ~ Java.Yes, the compiler is reasonably fast.Yes, we have an Eclipse Plugin.Yes, Maven/Gradle/etc. integration.Yes, we have HAMT (aka HashMap). Yes, we have QuickCheck (+shrinking) Yes, STM is almost finished.

Page 39: Frege - Jfokus...frege> twotimes x = times 2 x frege> twotimes 3 6 frege> :t twotimes Int -> Int No second arg! „Currying“, „schönfinkeling“, or „partial function application“

Unique in FregeGlobal type inference (requires purity)Purity by default effects are explicit in the type systemType-safe concurrency & parallelismLaziness by defaultValues are always immutable Guarantees extend into Java calls