2013-08-28 4 views
-1

Для следующей map подписи я читаю ее правильно?Понимание метода опционов

object OptionImpl extends Option { 
     def map[B](f: A => B): Option[B] 
    } 

источник - FP in Scala

[B] означает только объекты типа B могут вызвать эту функцию

f: A => B означает, что он принимает 1 аргумент, функция, которая возвращает тот же тип B

Я нечеткий на конкретном примере этой функции.

+1

Я не вижу «OptionImpl» во всей книге, и нет смысла подклассифицировать «Option» таким образом. Есть только два подкласса 'Option':' Some' и 'None'. –

+0

@ Даниэль, я имею в виду главу 4, упражнение 1 на стр. 58. «Выполнение вышеуказанных функций по признаку, опция« Опция » ' trait Option [+ A] { def map [B] (f: A => B): Option [B] ...} 'OptionImpl - это имя, которое я даю моей реализации' Option' –

+0

. Для целей упражнения «реализовать» не означает, что вам нужно подклассировать что-либо. Просто скопируйте символ «Option [+ A]» и напишите там код. –

ответ

4

B - это просто шаблон (т. Е. Общий). Он просто говорит, что эти два типа одинаковы:

def map[B](f: A => B): Option[B] 
       ^  ^

То есть, он говорит: если вы передадите мне функцию, которая преобразует A с до B с, я дам вам обратно в Option, которое может содержать B (где B может быть любого типа).

+0

Спасибо, Рекс. Не могли бы вы дать мне пример того, как объект 'Option' будет использовать функцию' map'? –

+2

@ Кевин - Нет, потому что у меня нет книги. Но если 'OptionImpl' был' Option [String] ', вы можете использовать его как' OptionImpl.map (s => s.length) ', чтобы получить' Option [Int] 'назад (который будет содержать' Int' если 'OptionImpl' фактически содержит строку). –

+0

Вы ожидаете, что этот метод будет состоять из 'if (A пуст) None else f'? Ваш пример 'Option [Int]' мне помог, но я пытаюсь написать реализацию признака в общем виде: 'trait Option [+ A] { \t def map [B] (f: A => B): Вариант [B]} ' –

2

Это очень полезная ссылка http://blog.tmorris.net/posts/scalaoption-cheat-sheet/ об использовании опции.

Если у вас есть сценарий, как этот

option match { 
    case None => None 
    case Some(x) => Some(foo(x)) 
} 

использования

option.map(foo(_)) 

Другой пример

def processBody(contentType: String): String = { 
..... 
} 

val body: Option[String] = 
    headers.get("Content-Type").map(processBody(_)) 

Я предположил, что здесь headers.get возвращает один вариант.

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