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] = { list.filter(p) } filter(l)(i => i < 10) //OR filter(l)(_ < 10)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 -
public <A> List<A> filter(List<A> list, Predicate<A> condition) { return list.stream().filter(condition).collect(toList()); }and type inference for the predicate works cleanly -
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); List lessThan10 = filter(ints, i -> i < 10);
No comments:
Post a Comment