Прежде всего, обратите внимание, что для того, чтобы быть «чистым», метод должен не только не иметь побочных эффектов. Он также должен всегда возвращать один и тот же результат, если ему даны одинаковые аргументы. Так, например, метод "Math.Sin" является чистым. Вы кормите в 12, это возвращает вам грех (12), и это то же самое каждый раз. Метод GetCurrentTime () не является чистым, даже если он не имеет побочных эффектов; каждый раз, когда вы его вызываете, он возвращает другое значение, независимо от того, какие аргументы вы передаете.
Также обратите внимание, что чистый метод действительно не должен вызывать исключения; исключения считаются наблюдаемыми побочными эффектами для наших целей.
Во-вторых, да, если вы можете рассуждать о чистоте метода, тогда вы можете делать интересные вещи для его автоматического распараллеливания. Проблема в том, что практически нет методов, которые на самом деле чисты. Кроме того, предположим, у вас есть чистый метод; поскольку чистый метод является идеальным кандидатом для запоминания, а поскольку запоминание вводит побочный эффект (он изменяет кэш!), очень привлекательно взять то, что должно быть чистыми методами, а затем сделать их нечистыми.
Что нам действительно нужно, так это какой-то способ «приручить побочные эффекты», как говорит Джо Даффи. Некоторый способ нарисовать рамку вокруг метода и сказать «этот метод не лишен побочных эффектов, но его побочные эффекты не видны за пределами этой рамки», а затем использовать этот факт для безопасного вождения автоматическое распараллеливание.
Я бы хотел найти способ добавить эти понятия в такие языки, как C #, но здесь все это просто проблема открытого исследования с голубым небом; никаких обещаний, предполагаемых или подразумеваемых.