Значения правой стрелки в Scala
В главе 9 программирования В Scala существует пример такого метода:
def twice(op: Double => Double, x: Double) = op(op(x))
Автор сказал в книге:
Тип op в этом примере Double = > Double, что означает, что это функция, которая принимает один двойной как аргумент и возвращает другое значение Double.
Я не понимаю, что такое "Double = > Doulbe" здесь, в предыдущих главах, где "= > " появляется только означает литерал функции и никогда не пишет "Type = > Type", потому что согласно scala функция литерального синтаксиса, правильная часть функционала - это тело функции, как тело функции может быть "Double"?
Ответы
Ответ 1
Потому что он имеет два использования.
Во-первых, вы можете использовать = > для определения литерала функции.
scala> val fun = (x: Double) => x * 2
fun: (Double) => Double = <function1>
scala> fun (2.5)
res0: Double = 5.0
Это довольно легко. Но вот вопрос: какой тип fun
? Это "функция, которая принимает Double как аргумент и возвращает double", правильно?
Итак, как я мог комментировать удовольствие своим типом? Это (Double) => (Double)
. Ну, предыдущий пример можно переписать на:
scala> val fun: Double => Double = (x: Double) => x * 2
fun: (Double) => Double = <function1>
scala> fun (2.5)
res1: Double = 5.0
ОК, то что делает следующий код?
def twice(op: Double => Double, x: Double) = op(op(x))
Ну, это говорит вам, что op - это (Double => Double)
, что означает, что ему нужна функция, которая принимает Double и возвращает Double.
Итак, вы можете передать предыдущую функцию fun
в свой первый аргумент.
scala> def twice(op: Double => Double, x: Double) = op(op(x))
twice: (op: (Double) => Double,x: Double)Double
scala> twice (fun, 10)
res2: Double = 40.0
И это будет эквивалентно замене op
на fun
и замените x
на 10
, то есть fun(fun(10))
, а результат будет равен 40.
Ответ 2
В дополнение к разделению списка параметров из тела функции в литерале функции двойная стрелка может использоваться в качестве синтаксического сахара для типа FunctionN:
T => R
означает Function1[T, R]
(T1, T2) => R
означает Function2[T1, T2, R]
...
В вашем примере это означает, что op
- это функция, которая принимает Double и возвращает Double (как объяснил автор).
В качестве другого примера можно написать
// declare len as a function that takes a String and returns an Int,
// and define it as returning the length of its argument
val len: String => Int = { _.length }
// or, a more verbose version that uses '=>' in both ways
val len: String => Int = { (s: String) => s.length }
len("apple") // returns 5
Ответ 3
Это функция, которая принимает двойной и возвращает double.
scala> def d2d = (d:Double) => d
d2d: (Double) => Double
Это тип Function1[Double,Double]