У меня есть общее представление о том, что это такое, но если у кого-то есть объяснение "проблемы с выражением", которое, по их мнению, кратким и интуитивным, я бы с удовольствием это услышал.
Что такое "проблема выражения"?
Ответ 1
Смотрите эту лекцию.
Идея заключается в том, что ваша программа представляет собой комбинацию типа данных и операций над ним. Проблема требует реализации, которая позволяет добавлять новые случаи типа и новых операций без необходимости перекомпиляции старых модулей и сохранения безопасности статического типа (без проверки типов или проверки времени выполнения).
Интересно заметить, что в функциональных языках программирования легко добавлять новые операции, но трудно добавить случаи к типу данных. Хотя на языке OO это наоборот. Это одна из больших концептуальных различий между двумя парадигмами программирования.
Ответ 2
Идея проблемы заключается в том, что текст является одномерным. Даже если у вас есть строки и столбцы, вы обычно читаете их, слово за словом, по строкам. Также компилятор.
И вы пытаетесь представить в нем какие-то 2 или более размерные данные. Например, таблица в порядке строки-мэра выглядит следующим образом:
((A, B, C), (D, E, F), (G, H, I))
В этом представлении довольно легко добавить новую строку в конец, не касаясь остальных:
((A, B, C), (D, E, F), (G, H, I), (J, K, L))
Но добавление столбцов немного проблематично, вам нужно прикоснуться к нему в 4 разных местах:
((A, B, C, M), (D, E, F, N), (G, H, I, O), (J, K, L, P))
Обычно вы сталкиваетесь с этой проблемой при работе с абстрактными классами: довольно просто добавить новый подтип в качестве нового модуля, но когда вы добавляете новый абстрактный метод, вам нужно коснуться всех модулей и добавьте его; вам нужно делать то же самое во многих местах. Обычно вы делаете абстракции для защиты от этих повторяющихся вещей.
Нет решения этой проблемы, пока вы используете 1D-представление.
Решение этой проблемы будет редактором, который может позволить вам редактировать эту таблицу, например, как реальную таблицу, а не как текст (в виде Excel, в котором вы можете удобно добавлять новые столбцы и строки).
Ответ 3
Также есть эта статья о решении проблемы с Clojure, однако проблема представлена в Java, поэтому она должна иметь смысл, даже если вы не знаете Clojure, особенно с помощью небольших диаграмм.
который говорит:
Филип Уодлер из Bell Labs ввел термин "проблема выражения" в неопубликованной статье, которую он распространил по электронной почте в 1998 году. По его словам, "проблема выражения - это новое название старой проблемы. Цель состоит в том, чтобы определить тип данных по случаям, когда можно добавить новые случаи к типу данных и новые функции над типом данных, без перекомпиляции существующего кода и при сохранении безопасности статического типа (например, без приведения). "