Как полезный знает лямбда-исчисление? [закрытый]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

71
задан Gordon Gustafson 25 June 2013 в 18:52
поделиться

10 ответов

Если Вы хотите программировать в каком-либо язык функционального программирования , это важно. Я имею в виду, как полезный это должно знать о Машинах Тьюринга? Ну, если Вы пишете C, парадигма языка вполне близко к Машинам Тьюринга - у Вас есть указатель команд и текущая команда, и машина принимает некоторые меры в текущем состоянии, и затем гуляет следующей инструкции.

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

26
ответ дан EfForEffort 24 November 2019 в 12:55
поделиться

Преимущество лямбда-исчисления - то, что это - чрезвычайно простая модель вычисления, которое эквивалентно Машине Тьюринга. Но в то время как Машина Тьюринга больше похожа на ассемблер, лямбда-исчисление является больше подобным высокоуровневый язык. И если Вы учитесь церковная кодировка , который поможет Вам изучить метод программирования, названный передающий продолжение стиль , который довольно полезен для реализации поиска отслеживания в обратном порядке и других аккуратных приемов.

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

Лямбда-исчисление также просто очень прохладно самостоятельно: точно так же, как знание ассемблера это будет углублять Ваше понимание вычисления . Это - особенно забава к , программируют универсальную машину Тьюринга в лямбда-исчислении. Но это - основополагающая математика, не практическое программирование.

80
ответ дан Norman Ramsey 24 November 2019 в 12:55
поделиться

Я думаю, что использование лямбда-исчисления относительно программирования на практике состоит в том, что это - довольно минимальная система, которая получает сущность абстракции (или "анонимные функции" или закрытия, если Вы будете). Кроме этого я не думаю, что это вообще важно кроме тех случаев, когда необходимо реализовать абстракцию сами (как Tetha ( 114646 ) упомянутый).

я также полностью не соглашаюсь с Denis Bueno ( 114701 ), кто говорит, что это важно для функционального программирования. Отлично возможно определить, использовать или понять функциональный язык без любого лямбда-исчисления вообще. Для понимания оценки условий на функциональных языках (который, по-моему, несколько противоречит использованию функционального языка), Вы, скорее всего, будете лучше из приобретения знаний о системах перезаписи термина.

15
ответ дан Community 24 November 2019 в 12:55
поделиться

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

, Но если у Вас есть любопытство о более глубоких тайнах, лежащих в основе этого материала, можно начать задаваться вопросом, как на эти вопросы можно было бы ответить. Понятия красивы и развернут Ваше воображение. Я также думаю, что они, несущественно, делают один лучшим practicioner.

то, Что получило меня сцепленный, было книгой Minsky Вычисление: Конечные и Бесконечные автоматы.

10
ответ дан Mike Dunlavey 24 November 2019 в 12:55
поделиться

Я соглашаюсь с теми, которые говорят, что теоретически возможно изучить функциональное программирование, не изучая лямбду calculus— но каково преимущество не изучение лямбда-исчисления? Это не, как будто это берет большие инвестиции времени.

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

12
ответ дан Keith Pinson 24 November 2019 в 12:55
поделиться

Лямбда-исчисление является вычислительной моделью, точно так же, как машина Тьюринга. Таким образом полезно, если необходимо реализовать определенное средство анализа для языка на основе этой модели, однако, на практике, Вам просто нужна основная идея (мм. аргумент места семантически исправляет в теле функции?) и это об этом.

4
ответ дан Tetha 24 November 2019 в 12:55
поделиться

Один возможный способ изучить лямбда-исчисление

http://en.wikipedia.org/wiki/Lambda_Calculus

Или, если Вы хотите больше, вот мой блог, выделенный лямбда-исчислению и материалу как этот

http://weblogs.manas.com.ar/lziliani/

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

http://www.amazon.com/Types-Programming-Languages-Benjamin-Pierce/dp/0262162091/ref=sr_1_1?ie=UTF8&s=books&qid=1222088714&sr=8-1

4
ответ дан 24 November 2019 в 12:55
поделиться

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

3
ответ дан Robert Elwell 24 November 2019 в 12:55
поделиться

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

0
ответ дан Nick Berardi 24 November 2019 в 12:55
поделиться

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

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

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

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

Однако, например, для эффективного использования Haskell вам необходимо понимать некоторые системы типов , которые независимо от лямбда-исчисления, система типов System F может применяться ко всем «функциям» и не требует лямбда-абстракций. вообще. Обычно в математике мы говорим f: R ^ 2 -> R: f (x) = x ^ 2. Мы могли бы сказать: f (x) = x ^ 2 :: R -> R -> R. Фактически, Haskell очень близок к этой нотации.

Лямбда-исчисление - это теоретический формализм, функции Haskell на самом деле являются не более «лямбда-абстракциями», чем f: f (x) = x ^ 2, на самом деле, что делает лямбда-абстракции интересными, так это то, что они позволяют нам определять то, что обычно рассматривается как «константы» как «функции», ни один функциональный язык не делает этого из-за огромных вычислительных затрат. Haskell и ему подобные - это лишь ограниченная форма системы типов Системы F , применяемая к функциям, используемым в повседневной классической математике. Функции в Haskell, конечно же, не являются анонимными заявителями формально символической редукции, как в лямбда-исчислении. Большинство языков функционального программирования не являются системами переписывания, основанными на символической редукции. В какой-то степени Лиспы, но это парадигма сама по себе, и его «ключевое слово лямбда» действительно не удовлетворяет называть его лямбда-исчислением.

22
ответ дан 24 November 2019 в 12:55
поделиться
Другие вопросы по тегам:

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