2016-08-25 4 views
6

Я принимаю Принципы Курса FP в курсе Scala, и у меня возникают проблемы с последней функцией в назначении недели 2. Мне не нужен ответ, а скорее какая-то помощь в понимании функциональности Scala. Я думаю, что у меня есть правильная идея о том, как решить проблему, я просто споткнулся о конкретной части Scala.Scala Else return function

Суть такова: мы уже дали псевдоним типа, определяемый как например:

type Set = Int => Boolean 

Что я истолковал означает набор функция, которая принимает Int и возвращает Bool.

Нам также поручено завершить функцию singletonSet, которая принимает int и возвращает Set. Я написал его в качестве такого

def singletonSet(x: Int): Set = Set(x) 
val three = singletonSet(3) 
three(3) //True 
three(5) //False 

Функция У меня возникли проблемы с функция Map, которая имеет эту подпись:

def map(s: Set, p: Int => Int): Set 

Что я истолковал означает функцию, которая принимает набор, преобразует его элементы с функцией P и возвращает новый набор.

pesudocode: Карта возвращает функцию, которая принимает Int, и если что ИНТ существует в Set s, возвращает новый набор с преобразованной Int X (или р (х)

Фактический код, который вырывается:

def map(s: Set, p: Int => Int): Set = { 
    x => 
    if (s(x)) singletonSet(p(x)) 
    else p(x) => false 
} 

The error that I'm getting with this format is: 
    error: not a legal formal parameter. 
    Note: Tuples cannot be directly destructured in method or function parameters. 
    Either create a single parameter accepting the Tuple1, 
    or consider a pattern matching anonymous function: `{ case (param1, param1) => ... } 
     else p(x) => false 

Я не grokking, что случилось с моей реализацией. друг написал свою логику в Haskell и нашел его, чтобы быть успешным, так что я думаю, что мой алгоритм правильно (хотя я могу ошибаться). Я m борются с деталями реализации Scala. Любые советы или рекомендации очень ценятся.

+2

У вас уже есть 'x => ...' в начале, поэтому вам нужно только тело новой функции, которая должна быть логическим выражением, но после ключевого слова 'else' у вас есть' p (x) = > false', что не имеет смысла, и это определенно * не * булево выражение –

+0

Написание этого в Haskell вызывает ошибки типа, поэтому, возможно, ваш друг исправил его во время перевода и мог рассказать вам, что они сделали? – molbdnilo

ответ

1

Помните, что вы имеете дело с Set здесь, а Set определяется как функция, которая преобразует Int в Boolean. Таким образом, ваша функция должна вернуть ту же вещь:

def map(s: Set, p: Int => Int): Set = { 
    x => 
    if (s(x)) singletonSet(p(x)) // Returns a Set 
    else p(x) => false   // Returns a Boolean 
} 

Мы можем видеть, что, несмотря на вход, у вас есть два различных случая вывода, которые мы знаем, должно быть не так. Теперь, позволяет также напомнить, что у вас есть другие функции, и ваше определение набора и «расширение», что вы строите:

def map(s: Set, p: Int => Int): (Int) => (Boolean) //Expand 'Set' to int->boolean 
    = (x: Int) => (Something that returns a boolean) 

Ваша задача выяснить, что это «нечто», на основе семантики от map. Я настоятельно рекомендую посмотреть на другие функции, которые возвращают логическое значение и спрашивают, как они могут применяться здесь. В частности, вы ищете функцию, которая для любого целого числа даст вам преобразование, если это целое существует в исходном наборе.