frege - purely functional programming on the jvm

44
Frege Purely Functional Programming on the JVM

Upload: dierk-koenig

Post on 30-Nov-2014

1.116 views

Category:

Software


3 download

DESCRIPTION

A short introduction to Frege - a language for the Java Platform in the spirit of Haskell. Held at JavaOne 2014, San Francisco. The live coverage of this talk will be later available on the Oracle JavaOne website. After you have looked at the slides, you may want to check out http://channel9.msdn.com/shows/Going+Deep/Brian-Beckman-Dont-fear-the-Monads/

TRANSCRIPT

Page 1: Frege - purely functional programming on the JVM

FregePurely Functional Programming

on the JVM

Page 2: Frege - purely functional programming on the JVM

Dierk König Canoo

mittie

Page 3: Frege - purely functional programming on the JVM
Page 4: Frege - purely functional programming on the JVM

differentFrege is

Page 5: Frege - purely functional programming on the JVM

differentFrege is very

Page 6: Frege - purely functional programming on the JVM

You would not believe just how different it is!

Page 7: Frege - purely functional programming on the JVM

Online REPL http://try.frege-lang.org

Page 8: Frege - purely functional programming on the JVM

Define a Functionfrege>    times  a  b  =  a  *  b  

frege>    times  3  4  

12  

frege>  :type  times  

Num  α  =>  α  -­‐>  α  -­‐>  α

Page 9: Frege - purely functional programming on the JVM

Define a Functionfrege>  times  a  b  =  a  *  b  

frege>  (times  3)  4  

12  

frege>  :type  times  

Num  α  =>  α  -­‐>(α  -­‐>  α)

no types declared

function appl. left associative

tell the inferred type

typeclassonly 1

parameter!return type is a function!

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

no comma

Page 10: Frege - purely functional programming on the JVM

Reference a Functionfrege>  twotimes  =  times  2  

frege>  twotimes  3  

6    

frege>  :t  twotimes  

Int  -­‐>  Int

Page 11: Frege - purely functional programming on the JVM

Reference a Functionfrege>  twotimes  =  times  2  

frege>  twotimes  3  

6  

frege>  :t  twotimes  

Int  -­‐>  Int

No second argument!

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

application“. Concept invented by

Gottlob Frege.

inferred types are more specific

Page 12: Frege - purely functional programming on the JVM

Function Compositionfrege>  twotimes  (threetimes  2)  

12  

frege>  sixtimes  =  twotimes  .  threetimes  

frege>  sixtimes  2  

frege>  :t  sixtimes  

Int  -­‐>  Int

Page 13: Frege - purely functional programming on the JVM

Function Compositionfrege>  twotimes  (threetimes  2)  

12  

frege>  sixtimes  =  twotimes  .  threetimes  

frege>  sixtimes  2  

frege>  :t  sixtimes  

Int  -­‐>  Int

f(g(x))

more about this later

(f ° g) (x)

Page 14: Frege - purely functional programming on the JVM

Pattern Matchingfrege>  times  0  (threetimes  2)  

0  

frege>  times  0  b  =  0

Page 15: Frege - purely functional programming on the JVM

Pattern Matchingfrege>  times  0  (threetimes  2)  

0  

frege>  times  0  b  =  0

unnecessarily evaluated

shortcuttingpattern matching

Page 16: Frege - purely functional programming on the JVM

Lazy Evaluationfrege>  times  0  (length  [1..])  

0endless sequence

evaluation would never stop

Pattern matching and non-strict evaluation

to the rescue!

Page 17: Frege - purely functional programming on the JVM

Pure FunctionsJava  

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

Frege  

foo  ::  (α,β)  -­‐>  α

What could possibly happen?

What could possibly happen?

Page 18: Frege - purely functional programming on the JVM

Pure FunctionsJava  

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

Frege  

foo  ::  (α,β)  -­‐>  α

Everything! NPEs, state

changes, endless loops, missile

launch,…

a is returned or

system error

Page 19: Frege - purely functional programming on the JVM

Java Interoperability

Page 20: Frege - purely functional programming on the JVM

Java -> FregeScripting:  JSR  223  

Service:       compile  *.fr  file       put  on  javac  classpath       call  static  method

simple

Page 21: Frege - purely functional programming on the JVM

Frege -> Java!

!data Date = native java.util.Date where native new :: () -> IO (MutableIO Date) -- new Date() native toString :: Mutable s Date -> ST s String -- d.toString()

This is a key distinction between Frege and previous efforts to port Haskell to the JVM.

Declaring the messiness.

Page 22: Frege - purely functional programming on the JVM

Some Cool Stuff

Page 23: Frege - purely functional programming on the JVM

Zippingaddzip  []  _    =  []addzip  _    []  =  []    

addzip  (x:xs)  (y:ys)  =                (x  +  y  :  addzip  xs  ys  )

Page 24: Frege - purely functional programming on the JVM

Zippingaddzip  []  _    =  []addzip  _    []  =  []    

addzip  (x:xs)  (y:ys)  =                (x  +  y  :  addzip  xs  ys  )

!

use as addzip  [1,2,3]                  [1,2,3]            ==  [2,4,6]

Pattern matching feels like Prolog

Why only for the (+) function? We could be more general…

Page 25: Frege - purely functional programming on the JVM

High Order FunctionszipWith  f  []  _    =  []zipWith  f  _    []  =  []    

zipWith  f  (x:xs)  (y:ys)  =                (f  x  y  :  zipWith  xs  ys  )  

!

!

Page 26: Frege - purely functional programming on the JVM

High Order FunctionszipWith  f  []  _    =  []zipWith  f  _    []  =  []    

zipWith  f  (x:xs)  (y:ys)  =                (f  x  y  :  zipWith  xs  ys  )

use as zipWith  (+)  [1,2,3]                            [1,2,3]                      ==  [2,4,6]  

and, yes we can now define   addzip  =               zipWith  (+)                    

invented by Gottlob Frege

Page 27: Frege - purely functional programming on the JVM

Fibonacci!

fib  =  0:  1:  addzip  fib  (tail  fib)  

! use as take  60  fib

a new solution approach

fib    0:1  …  tail  1  …  zip    1  …

Page 28: Frege - purely functional programming on the JVM

Fibonacci!

fib  =  0:  1:  addzip  fib  (tail  fib)  

! use as take  60  fib

a new solution approach

fib    0  1:1  …  tail      1  …  zip        2  …

Page 29: Frege - purely functional programming on the JVM

Fibonacci!

fib  =  0:  1:  addzip  fib  (tail  fib)  

! use as take  60  fib

a new solution approach

fib    0  1  1:2  …  tail          2  …  zip            3  …

Page 30: Frege - purely functional programming on the JVM

Fibonacci!

fib  =  0:  1:  addzip  fib  (tail  fib)  

! use as take  60  fib

a new solution approach

fib    0  1  1  2:3  …  tail              3  …  zip                5  …

Page 31: Frege - purely functional programming on the JVM

List ComprehensionPythagorean triples: a2 + b2 = c2!

[  (m*m-­‐n*n,  2*m*n,  m*m+n*n)    

|  m  <-­‐  [2..],  n  <-­‐  [1..m-­‐1]    

]  

!

Page 32: Frege - purely functional programming on the JVM

List ComprehensionPythagorean triples: a2 + b2 = c2!

[  (m*m-­‐n*n,  2*m*n,  m*m+n*n)    

|  m  <-­‐  [2..],  n  <-­‐  [1..m-­‐1]    

]  

!endless production

triples

think „nested loop“

Page 33: Frege - purely functional programming on the JVM

QuickCheck-­‐-­‐  An  AVL  tree  is  balanced  so  that  the  height  of  the  left  and  right  subtree  differ  by  at  most  1  

p_balance  =  forAll  aTree      (\tree  -­‐>  abs  tree.balance  <  2)  

! QuickCheck will create 500 different trees covering all corner cases in creation and

validate the invariant. (from Frege source code)

Page 34: Frege - purely functional programming on the JVM

Type SystemHindley-Milner more info for the programmer less work for the programmer more useful programs compile less bad programs compile

http://perl.plover.com/yak/typing/Endless recursion in merge sort detected by the type system.

Page 35: Frege - purely functional programming on the JVM

Mutable I/O

Mutable

Mutable

Keep the mess out!

Clean Computation

Clean Computation

Clean Computation

Page 36: Frege - purely functional programming on the JVM

Mutable I/O

Mutable

Mutable

Keep the mess out!

Clean Computation

Clean Computation

Clean Computation

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

Page 37: Frege - purely functional programming on the JVM

HistoryJava promise: „No more pointers!“!

But NullPointerExceptions (?)

Page 38: Frege - purely functional programming on the JVM

Frege is differentNo More But

state no state (unless declared)

statements expressions (+ „do“ notation)

interfaces type classes

classes & objects algebraic data types

inheritance polymorphism

null references Maybe

and the list goes on…

Page 39: Frege - purely functional programming on the JVM

Frege in comparison

useful

safe

JavaGroovy

FregeHaskell

Page 40: Frege - purely functional programming on the JVM

Frege in comparison

useful

safe

JavaGroovy

FregeHaskell

concept by Simon Peyton-Jones

Frege makes the Haskell spirit accessible to the Java programmer and provides a new level of safety.

apply logic

run computers

Page 41: Frege - purely functional programming on the JVM

Why FP mattersThe intellectual challenge The aesthetical enjoymentType system and modularity benefits!

It may even be useful!

„An investment in knowledge always pays the best interest.“

—Benjamin Franklin

Page 42: Frege - purely functional programming on the JVM

How?http://www.frege-­‐lang.org  

stackoverflow  „frege“  tag  

https://github.com/Dierk/Real_World_Frege

Join the effort!

Page 43: Frege - purely functional programming on the JVM

Gottlob Frege

"As I think about acts of integrity and grace, I realise that there is nothing in my knowledge that compares with Frege’s dedication to truth… !It was almost superhuman.“ —Bertrand Russel!!"Not many people managed to create a revolution in thought. Frege did.“ —Graham Priest !Lecture on Gottlob Frege: !http://www.youtube.com/watch?v=foITiYYu2bc

Page 44: Frege - purely functional programming on the JVM

Dierk König Canoo

Please fill th

e feedback

forms

mittie