What a Java guy can learn from Haskell??

Tomasz Nurkiewicz

nurkiewicz.com | nurkiewicz@gmail.com | @tnurkiewicz

I don't know Haskell


twitter.com/miketaylr/status/569212319864991744

What Haskell doesn't have?

  • null
  • variables
  • exceptions
  • void
  • Object
  • loops
  • method overloading
  • side effects

Type system

Hoogle


[a] -> (a -> b) -> [b]       //map

[a] -> (a -> Bool) -> Bool   //all, any

Ord a => [a] -> [a]          //sort
					

Structural search

IntelliJ IDEA


class $Class$ {
	public static int $method$(String $string$, 
	                           int $def$)
}
					

twitter.com/jessitron/status/529652972679331840

The world chose


Source: Are static typing and functional programming winning?

twitter.com/natpryce/status/557553705109950464

twitter.com/velartrill/status/615714789499637760

Stringly typed


String             uuid;
String             website;
String             email;
String             firstName, lastName;
String             clientXml;
int                birthYear;
long               registrationDate;
int                min, max;
boolean            registered;
int                priority;
					

Strongly typed


UUID               uuid;
URL                website;
Email              email;
Name               name;
Optional<Document> client;
Year               birth;
Instant            registration;
Range<Integer>     range;
Status             status;
Priority           priority;
					

Living documentation


CompletableFuture<BigDecimal> doSomeWork() {
	//...
}
					

Try<InputStream> tryOpen(File f) {
	return Try.of(() ->
		new FileInputStream(f));
}
					
static.javadoc.io/io.javaslang/javaslang/2.0.2/javaslang/control/Try.html

null


https://www.facebook.com/programistaplakaljakcommitowal

20 years of Java


twitter.com/ags313/status/598494588135985152

50 years of null


cake.sharonmattnadia.com/2008/10/cake-in-bag.html

infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare

Tony Hoare (2009)

"[null] led to innumerable errors, vulnerabilities, and system crashes,
which have probably caused a billion dollars of pain and damage [...]"

"Java 8 in Action"

  • [...] NullPointerException is by far the most common exception in Java.
  • [...] worsens readability by [filling] your code with often deeply nested null checks.
  • [...] It doesn’t have any semantic meaning [...]
  • [...] Java always hides pointers from developers except in one case: the null pointer.
  • [...] It creates a hole in the type system. [...] it can be assigned to any reference type

twitter.com/bsletten/status/587441266863943680

twitter.com/shipilev/status/553566131194454016

niebezpiecznik.pl/post/nullowy-sms-od-orange

niebezpiecznik.pl/post/pociag-do-nulla

http://stackoverflow.com/questions/4456438

"These unlucky people have names that break computers"

"[...]When Jennifer Null tries to buy a plane ticket,
she gets an error message on most websites
.
The site will say she has left
the surname field blank and ask her to try again.[...]

www.bbc.com/future/story/20160325-the-names-that-break-computer-systems


org.apache.catalina.connector.CoyoteAdapter

Option(al)?


Optional<String> opt = null;  //YOLO
					

scala> Some(null) == None
res1: Boolean = false
					

Kotlin & Ceylon

not-null by default


val s: String = "abc"
val x = s.length()

						

Doesn't compile


val s: String? = null
val x = s.length()

						

Checking


val s: String? = "abc"
val x: Int? = s?.length()

if (s != null) {
    val x2: Int = s.length()
}
						

Immutability

1994


Source: www.pearsoned.co.uk

Flyweight pattern

A flyweight [...] minimizes memory use by sharing as much data as possible with other similar objects;
[...] simple repeated representation would use an unacceptable amount of memory.
[...] Flyweight objects must be immutable.

Source: wikipedia.org/wiki/Flyweight_pattern

2013


Source: vaughnvernon.co/?page_id=168

value object - 258 times

immutable - 68 times

"Implementing DDD"

[...] model using Value Objects instead of Entities wherever possible.

[...] Entity’s design should be biased toward serving as a Value container

[...] Value types that measure, quantify, or describe things are easier to create, test, use, optimize, and maintain.


From chapter 6

Linus Torvalds

[...] performance almost always matters.
And I absolutely detest the fact that people [...]
dismiss performance concerns so readily.

Git mailing list, Fri, 8 Aug 2008

git


git-scm.com/book/en/v2/Git-Internals-Git-Objects

youtube.com/watch?v=1PhArSujR_A

Wolfenstein 3D (1992)


wikipedia.org/wiki/Wolfenstein_3D

float Q_rsqrt( float number ) {
  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y  = number;
  i  = * ( long * ) &y;         // evil floating point 
                                // bit level hacking
  i  = 0x5f3759df - ( i >> 1 ); // what the fuck? 
  y  = * ( float * ) &i;
  y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration,
                                              // this can be removed

  return y;
}					
wikipedia.org/wiki/Fast_inverse_square_root

twitter.com/id_aa_carmack/status/331918309916295168

Why?

  • Saving game state
  • Networking

Databases

  • Cassandra
  • HDFS
  • Datomic

twitter.com/kellabyte/status/552509551795535874

Summary

  • null
  • variables
  • exceptions
  • void
  • Object
  • loops
  • method overloading
  • side effects

Thank you!


nurkiewicz.github.io/talks/2016/haskell/