Почему определяет, ли функция чиста трудный?

вот другой пользователь, который получил ту же проблему: http://forums.sun.com/thread.jspa?threadID=284209&forumID=34

пользователь ddssot на том сообщении говорит

myDocumentBuilder.setEntityResolver(new EntityResolver() {
          public InputSource resolveEntity(java.lang.String publicId, java.lang.String systemId)
                 throws SAXException, java.io.IOException
          {
            if (publicId.equals("--myDTDpublicID--"))
              // this deactivates the open office DTD
              return new InputSource(new ByteArrayInputStream("".getBytes()));
            else return null;
          }
});

пользователь дальнейшие упоминания, "Как Вы видите, когда синтаксический анализатор поражает DTD, преобразователь объекта называют. Я распознаю свой DTD с его определенным идентификатором и возвращаю пустой документ XML вместо реального DTD, останавливая всю проверку..."

Hope это помогает.

9
задан IAdapter 22 October 2009 в 20:23
поделиться

7 ответов

Это особенно сложно в Python. Поскольку anObject.aFunc может быть изменен произвольно во время выполнения, вы не можете определить во время компиляции, какая функция вызовет anObject.aFunc () или даже будет ли она вообще функцией.

5
ответ дан 4 December 2019 в 09:37
поделиться

Вам также необходимо аннотировать каждый системный вызов, каждый FFI, ...

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

Это не так. теоретически неразрешимая проблема, но на практике это очень и очень трудно сделать так, чтобы вся система не чувствовала себя хрупкой.

Кстати, я не думаю, что это хорошая кандидатская диссертация; Фактически, в Haskell уже есть (версия) этого с монадой ввода-вывода.

И я уверен, что многие люди продолжают смотреть на это «на практике». (дикие предположения) Через 20 лет у нас может быть это.

10
ответ дан 4 December 2019 в 09:37
поделиться

В дополнение к другим отличным ответам здесь: ваш псевдокод смотрит только на то, изменяет ли функция переменные. Но на самом деле «чистый» означает не это. «Чистый» обычно означает нечто близкое к «ссылочно прозрачному». Другими словами, вывод полностью зависит от ввода. Так что такая простая вещь, как считывание текущего времени и включение его в результат (или чтение из ввода, или чтение состояния машины, или ...) делает функцию нечистой без изменения каких-либо переменных.

Кроме того, вы можете написать «чистую» функцию, которая изменяет переменные.

4
ответ дан 4 December 2019 в 09:37
поделиться

Я думаю, что основная проблема будет в том, чтобы делать это эффективно.

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

0
ответ дан 4 December 2019 в 09:37
поделиться

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

0
ответ дан 4 December 2019 в 09:37
поделиться

Обратите внимание, что сложность также зависит от языка. Для более динамичных языков можно в любой момент переопределить что угодно. Например, в Tcl

proc myproc {a b} {
    if { $a > $b } {
        return $a
    } else {
        return $b
    }
}

каждая отдельная часть может быть изменена в любое время. Например:

  • команда «if» может быть переписана для использования и обновления глобальных переменных
  • команда «return» в тех же строках может делать то же самое
  • может быть трассировкой выполнения на if команда, которая при использовании "if" переопределяет команду возврата на основе входных данных для команды if

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

0
ответ дан 4 December 2019 в 09:37
поделиться

Вот первое, что пришло мне в голову, когда я прочитал ваш вопрос.

Иерархия классов

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

Но рассмотрим виртуальные методы. Вы должны найти каждый производный тип и убедиться, что каждое переопределение этого метода не изменяет состояние. Определить это просто невозможно ни на каком языке / фреймворке, который допускает динамическую генерацию кода или является просто динамическим (если это возможно, это чрезвычайно сложно). Причина в том, что набор производных типов не фиксирован, поскольку новый может быть сгенерирован во время выполнения.

Возьмем C # в качестве примера. Ничто не мешает мне создать производный класс во время выполнения, который переопределяет этот виртуальный метод и изменяет состояние. Статическая проверка не сможет обнаружить этот тип модификации и, следовательно, не сможет подтвердить, был ли метод чистым или нет.

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

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