2016-05-20 2 views
0

Я учусь Scala и в коде ниже, используя flatMap (из 99 проблем Scala) У меня естьScala flatMap, что такое ms и e?

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { 
    case ms: List[_] => flatten(ms) 
    case e => List(e) 
} 

Теперь я совершенно запутались то, что «мс» и «е»? они должны быть чем-то ключевым, как будто я изменяю ms, чтобы сказать dd, я получаю ошибку «not found value ms». Если я навис над ними, я получаю подсказку, говорящую, что «ms» - это «Список [] []», а «e» - «Любой».

Я пробовал поиск в Google для «Элементов списка Scala ms и e» или «Scala flatMap ms и e» или «Scala, что означает регистр ms и регистр e?» но я, кажется, не нашел ничего, что объясняет, что такое «ms» и «e».

Являются ли они ключевыми словами? Где я могу найти информацию о них в документации Scala?

P.S. Я понимаю код, но только не то, что мс и е

ответ

4

Если вы новичок, позвольте мне объяснить шаг за шагом, что происходит здесь.

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { 
    case ms: List[_] => flatten(ms) 
    case e => List(e) 
} 

Написано пространно:

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something => 
    something match { 
     case ms: List[_] => flatten(ms) 
     case e => List(e) 
    } 
} 

Что ms и e?

Сначала позвольте мне сломать это.

Вы являетесь плоской карточкой над List[Any].

val x = List("Str1", "Str2", "Str3") 
val y = x flatMap { elementInList => List(elementInList) } 

Это означает, что для каждого элемента в списке вы создаете новый список с этим элементом в нем. Потому что его flatMap вы по существу получаете те же самые (одни и те же элементы) список назад.

Checkout, что произойдет, если вы используете map вместо flatMap:

val x = List("Str1", "Str2", "Str3") 
val y = x map { elementInList => List(elementInList) } 

valy будет:

List(List("Str1"), List("Str2"), List("Str3")) 

выписка http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

теперь, глядя на подробном примере :

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something => 
    something match { 
     case ms: List[_] => flatten(ms) 
     case e => List(e) 
    } 
} 

вы соответствуете по элементу в списке или в этом случае называетесь something. вы также соответствуете на элементах type.

, например

def myMatch(e: Any): String = { 
    e match { 
    case x: String => "Its a String: " + x 
    case y: Int  => "Its a Int: " + y 
    //notice how im using x twice.. its because they're in separate scope! 
    case x: Boolean => "Its a Boolean: " + x 
    case _   => "Its something else!" 
    } 
} 

вызывать myMatch с парами "hello" и он вернется "Its a String: hello".

invoke myMatch с параметром 1 и он вернется "Its a Int: 1".

выписка http://docs.scala-lang.org/tutorials/tour/pattern-matching.html

Что e и ms?

позволяет взглянуть на ваш код:

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { 
    case ms: List[_] => flatten(ms) 
    case e => List(e) 
} 

Если элемент в списке, который мы сейчас смотрим, типа List[_] (так же, как List[Any]), мы затем выполнить этот блок, flatten(ms). ms - это val, назначенный элементу после согласования.

Если элемент в списке, который мы сейчас смотрим, типа _ или по существу по умолчанию (case _ =>), а затем возвращает List(e), содержащие один элемент, который является элементом, который мы смотрели.

Это всегда будет возвращать List[List[Any]]. Который затем сплющивается до List[Any].

Я надеюсь, что это помогает,

Rhys

2

Здесь case ms: List[_] является типизированным соответствием для List элементов типа. ms не является ключевым словом, это просто переменная, представляющая элемент типа List.

И case e - это сопоставление переменных, это своего рода уловка всех сценариев. Он соответствует всем элементам, которые не являются List (так как List s будет соответствовать первому случаю). Опять e также не является ключевым словом.

Для получения дополнительной информации вы можете прочитать Kinds of patterns

1

мс, е - это только имена переменных. Вы можете позвонить им, как хотите.

В первом случае:

case ms: List[_] => flatten(ms) 

вы полагаете, что содержание Вашего списка

def myflatten(somelist : List[Any]) 

может быть подобран в виде списка [_] любого типа

Во втором случае заявление:

case e => List(e) 

вы полагаете, что содержание вашего списка может быть чем угодно.

Читать официальный документ: http://docs.scala-lang.org/tutorials/tour/pattern-matching.html

А вот некоторые учебник: https://kerflyn.wordpress.com/2011/02/14/playing-with-scalas-pattern-matching/ , чтобы получить некоторый фон о согласовании Scala шаблона.

-1

В общем, вы сравниваете с двумя разными случаями (например) случаи МСА, список любых, а другой имеет дело по умолчанию, заданное по электронной почте.поэтому, если у вас есть список [_], тогда будет реализовываться плоская карта, либо второй указанный вами параметр

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