2013-10-07 3 views
3

Поэтому предположим, у меня есть функция, которая ожидает набор с определением Int => Boolean и функцию f так:Scala и запись картографических функций

def map(s: Set, f: Int => Int): Set = {}

Теперь, как я применяю это f к каждому элементу этого множества s.

def map(s: Set, f: Int => Int): Set = { (i: Int) => f(s(i)) } 

Что конечно неправильно, потому что в f(s(i)), «s (I)» возвращает логическое значение, и, таким образом, не может применять f на него. Проблема в том, как я могу получить доступ к каждому элементу Set и применить к нему этот f?

Этот вопрос является частью функционального программирования Курсеры с курсом Scala.

+3

Если речь идет о курсе coursera, вы должны пометить его как домашнюю работу. Кроме того, вы не можете сделать это без повторения всех возможных значений, которые могут быть в наборе, для упражнений coursera. –

+1

@ DanielC.Sobral нет, [он не должен помечать его как домашнюю работу] (http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated) –

+0

Он должен признать, что это домашняя работа в самом вопросе, затем –

ответ

-3

Для этого вам необходимо использовать фальцовку.

def map(s: Set[Int], f: Int => Int): Set[Int] = 
    s.foldLeft(Set.empty[Int])((s,i) => s+f(i)) 
+0

Ну, f еще не применяется. Не должно быть s.foldLeft (Set.empty [Int]) ((s, i) => s + f (i))? – Kigyo

+4

Вопрос относится к определенному определению Set: 'Set с определением Int => Boolean', к которому ваше предлагаемое решение не будет применяться – maasg

5

Цель курса состоит в том, чтобы помочь вам понять функциональную модель, и в этом случае, как набор может быть представлена ​​функцией (называется charasteristic функция для этого набора).

Вместо окончательного решения, вот подсказка о том, как рассуждать об этой проблеме:

Учитывая характерную функцию f: Int => Boolean, которая определяет свой набор и x, в Int, если f(x) == true, то х принадлежит множеству. Теперь, если у вас есть функция g:Int=>Int , которую вы хотите сопоставить по набору, то вы хотите применить эту функцию к элементам, которые, как вы знаете, принадлежат к набору: if (f(x)) then g(x).

Попробуйте применить это мышление к своему упражнению.

+0

Спасибо тонну, @maasg за четкий ответ. Хотя я буду абсолютно благодарен, если вы сможете это мне понять: «если (f (x)), то g (x) 'во всяком случае эквивалентно« y => x == f (y) », обман Scala синтаксис, о котором я не знаю? – user1343318

+0

Нет, это разные выражения. 'y => x == f (y)' является выражением лямбда, которое указывает «заданное' y', для 'x' (из контекста замыкания) оно возвращает true, если' x' равно 'f (y)' – maasg

+1

@ user1343318 то, что вы ищете, - это набор таких элементов, что для каждого элемента 'y' результирующего набора должен быть элемент' x' в исходном наборе, который соответствует условию, что 'f (x) = = y', на которое нацелено ваше выражение 'y => x == f (y)', но оно все еще отсутствует. – maasg

1

Если вы написали правильно, существует функция:

def map(s: Set, f: Int => Int): Set = (i: Int) => exists(s, (x: Int) => i == f(x)) 

Bam одна линия!

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