One of the concepts mentioned in the Functional Programming in Scala is about the type inference in higher order functions in Scala and how it fails in certain situations and a workaround for the same. So consider a sample higher order function, purely for demonstration:
Ideally, passing in a list of say integers, you would expect the predicate function to not require an explicit type:
Type inference does not work in this specific instance however, the fix is to specify the type explicitly:
Or a better fix is to use currying, then the type inference works!
def filter[A](list: List[A], p: A => Boolean):List[A] = {
list.filter(p)
}
Ideally, passing in a list of say integers, you would expect the predicate function to not require an explicit type:
val l = List(1, 5, 9, 20, 30)
filter(l, i => i < 10)
Type inference does not work in this specific instance however, the fix is to specify the type explicitly:
filter(l, (i:Int) => i < 10)
Or a better fix is to use currying, then the type inference works!
def filter[A](list: List[A])(p: A=>Boolean):List[A] = {I was curious whether Java 8 type inference has this issue and tried a similar sample with Java 8 Lambda expression, the following is an equivalent filter function -
list.filter(p)
}
filter(l)(i => i < 10)
//OR
filter(l)(_ < 10)
public <A> List<A> filter(List<A> list, Predicate<A> condition) {and type inference for the predicate works cleanly -
return list.stream().filter(condition).collect(toList());
}
ListAnother blog entry on a related topic by the author of the "Functional Programming in Scala" book is available here - http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.htmlints = Arrays.asList(1, 5, 9, 20, 30);
ListlessThan10 = filter(ints, i -> i < 10);