Каково различие между динамическими языками и функциональными языками?

Попробуйте это (см. Комментарии в коде):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}
7
задан 26 June 2009 в 07:16
поделиться

5 ответов

Динамическая типизация, система типов, ортогональна «функциональной», парадигме программирования.

Динамические «языки» на самом деле динамически типизируются. Это означает, что у вас нет проверки типов переменных во время компиляции.

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

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

8
ответ дан 6 December 2019 в 07:07
поделиться

xtofl has already offered a good overall picture. I can speak to the C# point.

C# has been becoming easier to work with in a functional way for a while now:

  • C# 2 introduced anonymous methods, which made it easier to create delegates which used state which was otherwise local to a method
  • C# 3 introduced lambda expressions which are mostly like anonymous methods but even more compact
  • LINQ support in both C# 3 and .NET 3.5 made it easier to query data in a functional way, chaining together predicates, projections etc
  • None of the C# 4 features directly contributes to functional programming IMO, although named arguments and optional parameters may make it easier to create/use immutable types, which is one of the biggest features missing from the functional picture IMO.

(There are other things functional languages often have, such as pattern matching and more impressive type inference, but you can write a lot of functional-style code reasonably easily in C#.)

C# 4 will gain some dynamic abilities through the dynamic type (which itself is effectively a static type you can do anything with). This will be somewhat "opt in" - if you never use the dynamic type, C# will still be fully static language. There's no language support for responding dynamically, but the DLR has support for this - if you implement IDynamicMetaObjectProvider or derive from DynamicObject, for example, you can add dynamic behaviour.

I would say that C# isn't becoming a functional language or a dynamic language, but one in which you can code in a functional style and interoperate with dynamic platforms.

2
ответ дан 6 December 2019 в 07:07
поделиться

If you're interested in paradigms, the paper Programming Paradigms for Dummies: What Every Programmer Should Know covers them.

In functional programming, state is implicit - the program executes by calling functions which call other functions. In imperative programming and object oriented programming, state is explicit - you change the value of a variable or object's field.

In a way, functional and imperative systems can be seen as duals - what's fixed in one is a dynamic value in the other.

Closures - which trap some explicit, mutable state in an object which can be called as a function - sit somewhere between, being neither pure functional programming but not quite fully fledged objects; they are more like anonymous objects than functions.

'Dynamic languages' is vague term, usually meaning one of the following:

  • Dynamically Typed Languages - languages which delay determination of type to runtime, but the set of types is fixed. Examples are Smalltalk, Lisps, current Fortress implementations. Some otherwise statically typed languages also allow some dynamic type checks - Java, C#, C++ and Ada. ( it was a failed dynamic type cast from float to int in Ada that crashed Ariane 5 )

  • Languages with dynamic types - languages where new types can be created at runtime. The most popular is JavaScript. Because you have to run the program to determine the types, it's harder to make IDEs for these with type aware autocompletion.

  • Languages which are dynamically compiled - languages where new scripts can be compiled at runtime. This is true of bash, JSP, PHP and ASP at the page scale, and true for at a finer scale for lisps and JavaScript which support an 'eval' function which compiles and runs an expression.

Functional languages which are strongly typed often perform a large amount of type inference, so it's common for their programs to have less explicit typing than poorly implemented static typed languages. This can confuse people who have only seen the lack of explicit typing in dynamic typed languages into believing that type inference is the same as dynamic typing.

3
ответ дан 6 December 2019 в 07:07
поделиться

Чтобы выразить это простым (но не точным) ответом

  • Динамические языки - это те, в которых тип (имя класса) не так важен по сравнению со статически типизированными языками его Немезиды. Переменной могут быть назначены объекты разных типов в любой момент времени. Вызов методов разрешается во время выполнения. Это означает, что вы теряете преимущества статической типизации (предупреждения компилятора), но простые методы становятся универсальными - sort (list) работает как со списком строк, так и со списком целых чисел. например, Ruby et. все
  • Функциональные языки ценят неизменность. Программы написаны с точки зрения все больших и больших функций (обычно снизу вверх). Концепция состояния объекта и изменчивости осуждается . Функция в этом контексте является самодостаточной (термин Чистый согласно Википедии): все, что ей нужно для вывода, находится во вводе, которое она получает. Он также не производит побочных эффектов (если он явно не упоминает об этом) и возвращает согласованный вывод для заданного ввода. Это может привести к элегантному коду (см .: fluent interfaces), где входные данные передаются по конвейеру через функции diff для получения конечного результата, например LISP et.all

. Однако границы размываются из-за того, что языки берут лучшее из всех миров. .. У вас может быть язык, который может быть и тем, и другим, одним или ни одним. Он также не производит побочных эффектов (если он явно не упоминает об этом) и возвращает согласованный вывод для заданного ввода. Это может привести к элегантному коду (см .: fluent interfaces), где входные данные передаются по конвейеру через функции diff для получения конечного результата, например LISP et.all

. Однако границы размываются из-за того, что языки берут лучшее из всех миров. .. У вас может быть язык, который является и тем, и другим, одним или ни одним из них.
Он также не производит побочных эффектов (если он явно не упоминает об этом) и возвращает согласованный вывод для заданного ввода. Это может привести к элегантному коду (см .: fluent interfaces), где входные данные передаются по конвейеру через функции diff для получения конечного результата, например LISP et.all

. Однако границы размываются из-за того, что языки берут лучшее из всех миров. .. У вас может быть язык, который является и тем, и другим, одним или ни одним из них.
например, преимущественно статический C #, собирающий лямбда-выражения в версии 3.0 и привносящий динамические возможности в версию 4.0

8
ответ дан 6 December 2019 в 07:07
поделиться

Динамическая типизация и функциональное программирование - независимые концепции. В языке вы можете иметь одно, то и другое или оба.

Статическая типизация означает, что типы объектов известны во время компиляции. В динамической типизации они известны во время выполнения.

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

Примеры языков:

|----------------+---------+---------|
|                | Dynamic | Static  |
|----------------+---------+---------|
| Functional     | LISP    | Haskell |
| Not functional | PHP     | Java    |
|----------------+---------+---------|

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

4
ответ дан 6 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: