2016-06-16 3 views
0

Привет, Я пытаюсь понять scala больше, и я думаю, что я немного потерял эту подпись метода.Spark Scala Method Signature in DataFrame API

explode[A <: Product](input: Column*)(f: (Row) ⇒ TraversableOnce[A])(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[A]): DataFrame 

Во-первых, то, что является "<:" должно означать в квадратных brakcets? Являются ли типы A и B типами параметров? Но Column - это тип аргумента.

Во-вторых, похоже, что функция лямбда-функции от (Row) до Traversable [A], но я еще не видел лямбда, но не имеет аргумента левой стороны по правому аргументу хотя бы один раз.

Кроме того, я не 100 процентов usre почему он имеет неявное arg0: часть

Спасибо заранее!

ответ

1

Что означает «<:« Предполагается, что это означает в квадратных скобках?

<: означает подтип в Скале, так что здесь это означает, что A является подтипом Product. Он действует как своего рода верхней границы, которая ограничивает тип, который может быть передан здесь, чтобы быть подтипом Product

Аре А и В должен быть параметр типа? Но колонка аргумент типа

A не тип параметра, это показатель сам по себе, который называется параметром типа. Это немного запутанно, но в основном это означает, что вы можете передать любой тип, являющийся подтипом product, в эту позицию и использовать параметр типа внутри функции. Это делает функцию более общей, поскольку она может обрабатывать разные типы одновременно, и вам не нужно писать отдельные функции для разных типов;

это выглядит, как он делает функцию лямбда из (Row) до Traversable [А]

f: (row) => Traversable[A] является еще одним параметром, который в данном случае представляет собой тип функции, которая принимает (row) и вернуть Traversable[A]. По этому определению explode может принимать функцию как параметр, в этом случае это лямбда-выражение;

Чтобы проиллюстрировать последний случай:

def sum(x: Int, y: Int)(f: Int => Int) = f(x) + f(y) 
sum: (x: Int, y: Int)(f: Int => Int)Int 

sum(2,3)(x => 2*x) 
res2: Int = 10 

В заключении, функция взрывается принимает три параметра, в общей сложности, первый A является параметром типа. Второй и третий являются действительными аргументами функции, причем Input имеет тип Column, как вы заметили, и f, тип (row) => Traversable[A], который является типом функции.

+0

Действительно ли функция f всегда должна находиться в другом наборе круглых скобок, когда вы определяете параметры «обычных» типов и параметр типа функции? Будет ли он когда-либо выглядеть примерно так: a: Int, b: Int, f: (Int) => Int) или он будет выглядеть как (a: Int, b: Int, (f: (Int) => (Int)))? Спасибо и извините насчет запутанного «B» haha ​​ –

+1

Это не должно быть так, как вы можете проверить в scala REPL.Оба '(a: Int, b: Int, f: Int => Int)' и '(a: Int, b: Int) (f: Int => Int)' работают, но вы должны называть их тем же как вы их определяете. Последний позволяет вам передавать параметры в два этапа, что иногда дает вам преимущества. – Psidom

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