Как быстро понять первоклассную функцию?

Я читаю несколько книг о функциональном программировании в Swift. Когда я вижу, что в некоторых книгах говорится, что функция в swift - это «первоклассная функция», я не понимаю, что означает «первоклассная функция». Кто-нибудь может мне ответить или дать пример кода?


person Perry Chen    schedule 13.03.2015    source источник


Ответы (3)


Функции - это первоклассные граждане Swift, потому что вы можете рассматривать функцию как обычное значение. Например, вы можете…

  • назначить функцию локальной переменной,
  • передать функцию в качестве аргумента другой функции и
  • вернуть функцию из функции.
person Marius Schulz    schedule 13.03.2015
comment
и я думаю, что блок в target-c, мы также можем назначить блок локальной переменной и передать его в качестве аргумента другой функции, могу ли я подумать, что блок в objective-c также является первоклассным? - person Perry Chen; 13.03.2015
comment
Да, блоки Objective-C тоже первоклассные. - person rob mayoff; 13.03.2015

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

Он всегда был в программировании; в C и Fortran есть указатели на функции. Типичное использование в обоих этих языках - передача функции сравнения в функцию сортировки, чтобы функция сортировки могла сортировать данные любого типа.

На некоторых языках, например Java, похоже, у вас нет указателей на функции, но есть указатели на интерфейсы. Итак, вы определяете интерфейс Comparable с помощью метода сравнения и передаете экземпляр Comparable вашей сортировке.

Ничего нового, просто сбивающая с толку терминология знакомого понятия. Предположительно, чтобы попытаться сделать так, чтобы функция казалась новой и сексуальной.

person Howard Lovatt    schedule 13.03.2015
comment
Я должен согласиться, что название «первый класс» немного расплывчатое. Я бы предпочел что-то вроде "справки по функциям" или что-то более наглядное. - person LegendLength; 09.04.2017

См. Мой ответ в этом вопросе. И я добавлю еще один пример (сначала проверьте пример в этом вопросе):

func operateMono( operand: String) -> (Double -> Double)?{
    switch operand{
    case "log10":
        return log
    case "log2":
        return log2
    case "sin":
        return sin
    case "cos":
        return cos
    default:
        return nil
    }
}

И использование

var functionMono = operateMono("log10")
print ("log10 for 10 = \(functionMono!(10))")

functionMono = operateMono("log2")
print ("log2 for 10 = \(functionMono!(10))")

functionMono = operateMono("sin")
print ("sin 10 = \(functionMono!(10))")

functionMono = operateMono("cos")
print ("cos 10 = \(functionMono!(10))")
person William Kinaan    schedule 11.09.2015