Имеет ли [Pure] какие-либо последствия, кроме отсутствия видимых побочных эффектов для Code Contracts?

документация PureAttribute говорит:

Указывает, что тип или метод являются чистыми, т. е. не вносят никаких видимых изменений состояния.

  1. Является ли это единственным требованием к функции Pure в соответствии с контрактами Microsoft Code?

  2. А также; предполагает ли эта модель, что исключения являются результатами (в отличие от побочных эффектов)?

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

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

Если [Pure] действительно ограничен менее ограничительной формой, существует ли эквивалент «[FunctionalPure]»?


person user2864740    schedule 02.01.2015    source источник
comment
Связанное обсуждение: stackoverflow.com/questions/12335245/   -  person 500 - Internal Server Error    schedule 02.01.2015
comment
@ 500-InternalServerError Спасибо, это очень хорошее чтение. Я не думал об этом с точки зрения этой детерминистской (или ее отсутствия) природы.   -  person user2864740    schedule 02.01.2015


Ответы (1)


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

Дано

[Pure]
public delegate int F(int i);

public class A
{
  public void f(F f)
  {
    var i = f(1);
    Contract.Assert(i == f(1));
  }
}

генерируется предупреждение: «Предполагаемое предположение: предположение может быть доказано: рассмотрите возможность изменения его в утверждение».

Так, например, DateTime.Now нельзя аннотировать атрибутом Pure.

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

person Community    schedule 02.01.2015