2012-02-07 2 views
2

Кто-нибудь может объяснить мне, как работать с вызовом по имени внутри компилятора scala? Синтаксический ярлык для этого метода будет таким: arg: =>Int будет преобразован в arg:() => Int и фиксирует переданный параметр функции, как закрытие? i.e реальный тип параметра для вызова по имени: Function0[_]?параметр call-by-name

Спасибо.

+1

Что вы хотите сделать? Вопрос непонятен. –

+0

@ DanielC.Sobral Привет. Предположим, что я хочу что-то вроде: def foo (i: => Int): либо [Int, Function1 [здесь нужен тип параметра «по вызову», либо [_, _]]] '. ** Как я могу это написать? ** Вопрос о чисто гипотетических ... – dvigal

ответ

3

Если я правильно понял вопрос правильно, да синтаксис => Int по существу легкий синтаксис для анонимной функции без параметров () => Int, который представлен по типу Function0[Int] в Scala. Кроме того, в параметрах By-name VM переходят во внутренние классы.

4

Параметры вызова по имени, как вы сами обнаружили, desugar до Function0[A]. У них нет поддержки первого класса и, следовательно, не существует другого типа.

Вы можете добиться чего-то в этом направлении, используя Name от Scalaz. Для этого см. Принятый ответ here.

1

Нет такой вещи, как «type by-name». По-имени не является типом, это режим передачи параметров.

Вместо параметра, передаваемого по имени, вы можете использовать Function0, но имеет другую семантику.

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