Как определить тип scala для функции без аргументов? - PullRequest
7 голосов
/ 29 августа 2011

Это работает

def func(f: => Int) = f

Это не так (например, внутри класса)

type EmptyFunct = => Int

или

 type EmptyFunct = (=> Int)

Версия Scala 2.9 Два вопроса:

  1. Почему не работает синтаксический сахар во втором случае?
  2. Как определить эту функцию без синтаксического сахара?

Ответы [ 3 ]

12 голосов
/ 29 августа 2011

=> Int - это не совсем функция без параметра, это аргумент Int с соглашением о вызове по имени.(Конечно, это довольно хороший момент, так как он реализуется передачей функции без параметра).

Функция без аргумента записана () => Int.Вы можете сделать type EmptyFunct = () => Int.

Это не тип.Внутри func, f будет напечатан как Int.Аргумент типа () => Int не будет.

def func(f: => Int) = f *2

func (: => Int) Int

Но

def func(f: () => Int) : Int = f*2

ошибка: значение * не является членом () => Int

3 голосов
/ 29 августа 2011

Вы должны использовать Function0

В первом случае это не работает, потому что вы объявляете функцию без аргумента, а потому что указываете, что параметр вызывается по имени.

0 голосов
/ 29 августа 2011

Я не вижу большого смысла в методе, возвращающем int, вызванном без параметра. Либо он возвращает константу, так что вы можете использовать константу, либо он будет использовать переменную?

Итак, давайте перейдем к переменной:

var k = 10 
val fi = List (() => k * 2, () => k - 2)
val n = fi(0)
n.apply 
k = 11
n.apply

результат равен 20, затем 22.

...