Зачем делать разницу между методами и функциями в Scala? - PullRequest
4 голосов
/ 25 февраля 2012

Я читал о методах и функциях в Scala. пост Джима и Даниэля дополняют , что делает хорошую работу по объяснению различий между ними.Вот что я взял с собой:

  • функции являются объектами, а методы - нет;
  • как следствие функции могут быть переданы в качестве аргумента, но методы не могут;
  • методы могут быть параметризованными по типу, функции не могут;
  • методы быстрее.

Я также понимаю разницу между def, val и var.

Теперь у меня фактически два вопроса:

  1. Почему мы не можем параметризовать метод apply функции для параметризации функции?И
  2. Почему объект функции не может быть вызван для более быстрой работы?Или вызывать функцию, вызывая исходный метод напрямую?

Ждем ваших ответов и большое спасибо заранее!

Ответы [ 2 ]

8 голосов
/ 25 февраля 2012

1 - Параметризация функций.

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

trait Function1[+T,-R] { ... }

, что означает, что другая функция, которая может принимать больше аргументов, считается подклассом (поскольку она может обрабатывать все, что может обработать суперкласс), и если она выдает меньший набор результатов, это нормально (так как она также подчиняется суперклассу построить так) Но как вы кодируете

def fn[A](a: A) = a

в этих рамках? Все дело в том, что возвращаемый тип равен переданному типу, каким бы он ни был. Тебе понадобится

Function1[ ThisCanBeAnything, ThisHasToMatch ]

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

2 - Скорость функций.

Это действительно просто: функция - это метод apply для другого объекта. Вы должны иметь этот объект для вызова его метода. Это всегда будет медленнее (или, по крайней мере, не быстрее), чем вызов вашего собственного метода, поскольку вы уже имеете его.

С практической точки зрения, JVM могут очень хорошо выполнять функции вставки в эти дни; часто нет никакой разницы в производительности, если вы в основном используете свой метод или функцию, не создавая объект функции снова и снова. Если вы глубоко вкладываете очень короткие циклы, вы можете создать слишком много функций; перемещение их в vals вне вложенных циклов может сэкономить время. Но не беспокойтесь, пока не сравнитесь и не узнаете, что там есть узкое место; обычно JVM делает правильные вещи.

0 голосов
/ 25 февраля 2012

Подумайте о сигнатуре типа функции.Это явно говорит, какие типы он принимает.Поэтому параметризация типа apply () будет несовместимой.

Функция - это объект, который необходимо создать, инициализировать, а затем собрать мусором.При вызове apply () он должен захватывать объект функции в дополнение к родительскому объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...