Frege 
Purely Functional Programming 
on the JVM
Dierk König 
Canoo 
mittie
Frege is different
Frege is very different
You would not believe 
just how different it is!
Online REPL 
http://try.frege-lang.org
Define a Function 
frege> 
times 
a 
b 
= 
a 
* 
b 
frege> 
times 
3 
4 
12 
frege> 
:type 
times 
Num 
α 
=> 
α 
-­‐> 
α ...
Define a Function 
frege> 
times 
a 
b 
= 
a 
* 
b 
frege> 
(times 
3) 
4 
12 
frege> 
:type 
times 
Num 
α 
=> 
α 
-­‐>(α...
Reference a Function 
frege> 
twotimes 
= 
times 
2 
frege> 
twotimes 
3 
6 
frege> 
:t 
twotimes 
Int 
-­‐> 
Int
Reference a Function 
frege> 
twotimes 
= 
times 
2 
frege> 
twotimes 
3 
6 
frege> 
:t 
twotimes 
Int 
-­‐> 
Int 
No seco...
Function Composition 
frege> 
twotimes 
(threetimes 
2) 
12 
frege> 
sixtimes 
= 
twotimes 
. 
threetimes 
frege> 
sixtime...
Function Composition 
frege> 
twotimes 
(threetimes 
2) 
f(g(x)) 
12 
more about this later 
frege> 
sixtimes 
= 
twotimes...
Pattern Matching 
frege> 
times 
0 
(threetimes 
2) 
0 
frege> 
times 
0 
b 
= 
0
Pattern Matching 
frege> 
times 
0 
(threetimes 
2) 
0 
unnecessarily evaluated 
frege> 
times 
0 
b 
= 
0 
pattern matchi...
Lazy Evaluation 
frege> 
times 
0 
(length 
[1..]) 
0 endless sequence 
evaluation would never stop 
Pattern matching and ...
Pure Functions 
Java 
T 
foo(Pair<T,U> 
p) 
{…} 
Frege 
foo 
:: 
(α,β) 
-­‐> 
α 
What could 
possibly happen? 
What could ...
Pure Functions 
Java 
T 
foo(Pair<T,U> 
p) 
{…} 
Frege 
foo 
:: 
(α,β) 
-­‐> 
α 
Everything! 
NPEs, state 
changes, endles...
Java Interoperability
Java -> Frege 
Scripting: 
JSR 
223 
Service: 
compile 
*.fr 
file 
put 
on 
javac 
classpath 
call 
static 
method 
simpl...
Frege -> Java 
! 
! 
data Date = native java.util.Date where 
Declaring the messiness. 
native new :: () -> IO (MutableIO ...
Some Cool Stuff
Zipping 
addzip 
[] 
_ 
= 
[] 
addzip 
_ 
[] 
= 
[] 
addzip 
(x:xs) 
(y:ys) 
= 
(x 
+ 
y 
: 
addzip 
xs 
ys 
)
Zipping 
addzip 
[] 
_ 
= 
[] 
addzip 
_ 
[] 
= 
[] 
addzip 
(x:xs) 
(y:ys) 
= 
(x 
+ 
y 
: 
addzip 
xs 
ys 
) 
! 
use as ...
High Order Functions 
zipWith 
f 
[] 
_ 
= 
[] 
zipWith 
f 
_ 
[] 
= 
[] 
zipWith 
f 
(x:xs) 
(y:ys) 
= 
(f 
x 
y 
: 
zipW...
invented by Gottlob Frege 
High Order Functions 
zipWith 
f 
[] 
_ 
= 
[] 
zipWith 
f 
_ 
[] 
= 
[] 
zipWith 
f 
(x:xs) 
(...
Fibonacci 
! 
fib 
= 
0: 
1: 
addzip 
fib 
(tail 
fib) 
! use as 
take 
60 
fib 
a new solution approach 
fib 
0:1 
… 
tai...
Fibonacci 
! 
fib 
= 
0: 
1: 
addzip 
fib 
(tail 
fib) 
! use as 
take 
60 
fib 
a new solution approach 
fib 
0 
1:1 
… 
...
Fibonacci 
! 
fib 
= 
0: 
1: 
addzip 
fib 
(tail 
fib) 
! use as 
take 
60 
fib 
a new solution approach 
fib 
0 
1 
1:2 
...
Fibonacci 
! 
fib 
= 
0: 
1: 
addzip 
fib 
(tail 
fib) 
! use as 
take 
60 
fib 
a new solution approach 
fib 
0 
1 
1 
2:...
List Comprehension 
Pythagorean triples: a2 + b2 = c2! 
[ 
(m*m-­‐n*n, 
2*m*n, 
m*m+n*n) 
| 
m 
<-­‐ 
[2..], 
n 
<-­‐ 
[1....
List Comprehension 
Pythagorean triples: a2 + b2 = c2! 
[ 
(m*m-­‐n*n, 
2*m*n, 
m*m+n*n) 
| 
m 
<-­‐ 
[2..], 
n 
<-­‐ 
[1....
QuickCheck 
-­‐-­‐ 
An 
AVL 
tree 
is 
balanced 
so 
that 
the 
height 
of 
the 
left 
and 
right 
subtree 
differ 
by 
at...
Type System 
Hindley-Milner 
more info for the programmer 
less work for the programmer 
more useful programs compile 
les...
Keep the mess out! 
Mutable 
I/O 
Mutable 
Clean Computation 
Clean Computation 
Mutable 
Clean Computation
Keep the mess out! 
Mutable 
I/O 
Mutable 
Clean Computation 
Clean Computation 
Mutable 
Clean Computation 
Ok, these are...
History 
Java promise: „No more pointers!“! 
But NullPointerExceptions (?)
Frege is different 
No More But 
state no state (unless declared) 
statements expressions (+ „do“ notation) 
interfaces ty...
Frege in comparison 
useful 
safe 
Groovy 
Java 
Frege 
Haskell
Frege in comparison 
useful 
safe 
Groovy 
Java 
Frege 
Haskell 
concept by 
Simon Peyton-Jones 
Frege makes the Haskell s...
Why FP matters 
The intellectual challenge 
The aesthetical enjoyment 
Type system and modularity benefits! 
It may even b...
How? 
http://www.frege-­‐lang.org 
stackoverflow 
„frege“ 
tag 
https://github.com/Dierk/Real_World_Frege 
Join the effort...
Gottlob 
Frege 
"As I think about acts of integrity and grace, 
I realise that there is nothing in my knowledge 
that comp...
Please fill the feedback forms 
Dierk König 
Canoo 
mittie
Frege - purely functional programming on the JVM
Nächste SlideShare
Wird geladen in …5
×

Frege - purely functional programming on the JVM

3.481 Aufrufe

Veröffentlicht am

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/

Veröffentlicht in: Software

Frege - purely functional programming on the JVM

  1. 1. Frege Purely Functional Programming on the JVM
  2. 2. Dierk König Canoo mittie
  3. 3. Frege is different
  4. 4. Frege is very different
  5. 5. You would not believe just how different it is!
  6. 6. Online REPL http://try.frege-lang.org
  7. 7. Define a Function frege> times a b = a * b frege> times 3 4 12 frege> :type times Num α => α -­‐> α -­‐> α
  8. 8. Define a Function frege> 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 typeclass only 1 parameter! return type is a function! thumb: „two params of same numeric type returning that type“ no comma
  9. 9. Reference a Function frege> twotimes = times 2 frege> twotimes 3 6 frege> :t twotimes Int -­‐> Int
  10. 10. Reference a Function frege> 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
  11. 11. Function Composition frege> twotimes (threetimes 2) 12 frege> sixtimes = twotimes . threetimes frege> sixtimes 2 frege> :t sixtimes Int -­‐> Int
  12. 12. Function Composition frege> twotimes (threetimes 2) f(g(x)) 12 more about this later frege> sixtimes = twotimes . threetimes frege> sixtimes 2 (f ° g) (x) frege> :t sixtimes Int -­‐> Int
  13. 13. Pattern Matching frege> times 0 (threetimes 2) 0 frege> times 0 b = 0
  14. 14. Pattern Matching frege> times 0 (threetimes 2) 0 unnecessarily evaluated frege> times 0 b = 0 pattern matching shortcutting
  15. 15. Lazy Evaluation frege> times 0 (length [1..]) 0 endless sequence evaluation would never stop Pattern matching and non-strict evaluation to the rescue!
  16. 16. Pure Functions Java T foo(Pair<T,U> p) {…} Frege foo :: (α,β) -­‐> α What could possibly happen? What could possibly happen?
  17. 17. Pure Functions Java T foo(Pair<T,U> p) {…} Frege foo :: (α,β) -­‐> α Everything! NPEs, state changes, endless loops, missile launch,… a is returned or system error
  18. 18. Java Interoperability
  19. 19. Java -> Frege Scripting: JSR 223 Service: compile *.fr file put on javac classpath call static method simple
  20. 20. Frege -> Java ! ! data Date = native java.util.Date where Declaring the messiness. 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.
  21. 21. Some Cool Stuff
  22. 22. Zipping addzip [] _ = [] addzip _ [] = [] addzip (x:xs) (y:ys) = (x + y : addzip xs ys )
  23. 23. Zipping addzip [] _ = [] 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…
  24. 24. High Order Functions zipWith f [] _ = [] zipWith f _ [] = [] zipWith f (x:xs) (y:ys) = (f x y : zipWith xs ys ) ! !
  25. 25. invented by Gottlob Frege High Order Functions zipWith 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 (+)
  26. 26. Fibonacci ! fib = 0: 1: addzip fib (tail fib) ! use as take 60 fib a new solution approach fib 0:1 … tail 1 … zip 1 …
  27. 27. 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 …
  28. 28. 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 …
  29. 29. 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 …
  30. 30. List Comprehension Pythagorean triples: a2 + b2 = c2! [ (m*m-­‐n*n, 2*m*n, m*m+n*n) | m <-­‐ [2..], n <-­‐ [1..m-­‐1] ] !
  31. 31. List Comprehension Pythagorean 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“
  32. 32. 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)
  33. 33. Type System Hindley-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.
  34. 34. Keep the mess out! Mutable I/O Mutable Clean Computation Clean Computation Mutable Clean Computation
  35. 35. Keep the mess out! Mutable I/O Mutable Clean Computation Clean Computation Mutable Clean Computation Ok, these are Monads. Be brave. Think of them as contexts that the type system propagates and makes un-escapable.
  36. 36. History Java promise: „No more pointers!“! But NullPointerExceptions (?)
  37. 37. Frege is different No 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…
  38. 38. Frege in comparison useful safe Groovy Java Frege Haskell
  39. 39. Frege in comparison useful safe Groovy Java Frege Haskell 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
  40. 40. Why FP matters The intellectual challenge The aesthetical enjoyment Type system and modularity benefits! It may even be useful! „An investment in knowledge always pays the best interest.“ —Benjamin Franklin
  41. 41. How? http://www.frege-­‐lang.org stackoverflow „frege“ tag https://github.com/Dierk/Real_World_Frege Join the effort!
  42. 42. 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
  43. 43. Please fill the feedback forms Dierk König Canoo mittie

×