2013-10-06 4 views
0

У меня есть очень простой пример набора s1 {1, 2}, и я хочу применить к нему предикат p> 1. Теперь я реализовал эту функцию, и это дает мне правильные результаты.Scala Predicates и функции фильтра?

def filter(s: Set, p: Int => Boolean): Set = {(i: Int) => s(i) && p(i)} 

Где определение множества

type Set = Int => Boolean 

Но есть более элегантный способ сделать это в Scala?

+0

Я думаю, у вас есть веская причина, чтобы определить 'Set', как это, а не использовать стандартную библиотеку коллекции Scala? – ghik

+0

Да, это часть курса Курсеры Мартина Одерского. – user1343318

+0

@ user1343318 Вы можете оставить '{}' и аннотацию типа после 'i', поэтому тело будет выглядеть так:' i => s (i) && p (i) '. Кроме того, это выглядит отлично ... :) –

ответ

3

Используя этот курс, определение того, что такое Set, ваш ответ очень изящный.

Поскольку предикат фактически Set тоже filter могло бы быть гораздо более лаконичным за счет многократного использования функции intersect:

/** 
* Returns the intersection of the two given sets, 
* the set of all elements that are both in `s` and `t`. 
*/ 
def intersect(s: Set, t: Set): Set = ??? 

/** 
* Returns the subset of `s` for which `p` holds. 
*/ 
def filter(s: Set, p: Int => Boolean): Set = intersect(s, p) 

Я оставил реализацию пересекаться вне потому что Coursera Honor Code предотвращает разделение ответов назначения.

Смежные вопросы