2016-08-05 3 views
2

Я новичок в scala.Scala Currying синтаксис объяснение

Я хочу понять синтаксис этого ниже кода

object PlainSimple { 

def main(args:Array[String]) 
{ 
val m = add(5) 
println(m(3)) 
} 

def add(x:Int):Int=>Int = 
{ 
    y=>y+x 
} 

} 

Мой вопрос, где мы говорим, что функция добавить возвращает другую функцию?

Что означает Int=>Int?

Внутри функции добавления, что называется y? Почему мы используем его, не объявляя его нигде?

Что нужно делать, если хотите, чтобы линия множественного ввода внутри добавляла метод?

+0

связанно: http://stackoverflow.com/questions/24086444/scala-syntax-help -currying? rq = 1 – Elazar

+0

Ваш вопрос хороший, но он не имеет ничего общего с карри. Документация SO имеет [несколько примеров] (http://stackoverflow.com/documentation/scala/1636/currying#t=201608051605514578482) рекомендаций и рекомендаций по ее использованию. – jwvh

ответ

2

Мой вопрос: Где мы говорим что функция add возвращает другую функцию?

Что такое Int => Int означает?

T => U как тип означает «функцию, которая принимает T и возвращает U». Поэтому, когда мы пишем : Int => Int в конце сигнатуры функции, мы говорим: «Эта функция возвращает функцию от Int до Int».

Внутри функции добавления, что называется y? Почему мы используем его, не объявляя его нигде?

Как выражение x => body (или (x,y,z) => body для нескольких параметров) является функцией буквальным, то есть он определяет анонимную функцию параметр которого назван x и чье тело body. Поэтому мы объявляем параметр x, записывая его имя левой стороны =>.

Что нужно делать, если хотите, чтобы линия умножения внутри метода добавила?

Вы можете положить что-нибудь справа =>, что вы могли бы также поставить справа от = при определении метода с использованием def. Так что если вы хотите тело вашей функции, чтобы состоять из нескольких операторов, вы можете использовать фигурные скобки так же, как с обычным определением методы:

y => { 
    val z = y+x 
    z*2 
} 
6

Мой вопрос: Где мы говорим, что функция add возвращает другую функцию?

Прямо здесь

def add(x: Int): Int => Int = y => y + x 

Int => Int является тип функции. Это просто синтаксический сахар, но вы также можете написать его как

def add(x:Int): Function1[Int, Int] = y => y + x 

Теперь, что y? y => y + x - это лямбда, то есть анонимная функция. Эта лямбда принимает один параметр, который мы теперь называем y.

Вот хорошая ссылка на анонимные функции в Скале и их синтаксис: http://docs.scala-lang.org/tutorials/tour/anonymous-function-syntax.html

Для того, чтобы иметь несколько строк внутри метода просто использовать фигурные скобки

def add(x:Int): Function1[Int, Int] = { y => 
    println("whaveter") 
    y + x 
} 
+0

Возможно, вы можете добавить объяснение к 'def add (x: Int) (y: Int): Int = y + x' и вызвать его с помощью' add (5) _'. – Elazar

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