У меня есть код F #, который кэширует результаты для будущего поиска. Я понимаю, что словари и другие структуры данных, которые вы добавляете, требуют побочных эффектов. (т. е. изменение состояния словаря). Правильно ли это? Это считается нечистым или это все еще находится в модели свободного вычисления свободных побочных эффектов.Может ли memoizing возможно без побочных эффектов
let rec fib =
let dict = new System.Collections.Generic.Dictionary<_,_>()
fun n ->
match dict.TryGetValue(n) with
| true, v -> v
| false, _ ->
let fibN =
match n with
| 0 | 1 -> n
| _ -> fib (n - 1) + fib(n - 2)
dict.Add(n, fibN)
fibN
Мое F # может быть немного ржавым, но я не вижу, как последовательные вызовы 'fib' могут делиться экземпляром' dict' для обеспечения кэширования. Не будет ли каждый вызов функции получить свой собственный экземпляр 'dict'? – CoderDennis
@CoderDennis Его закрытие над dict. Слово fib связано с функцией lamda, которая выполняет логику. Каждый вызов разделяет привязку dict – t3dodson
Проблема с побочными эффектами - это область действия и способность рассуждать о том, как функционирует система. Вот почему глобальные переменные являются высшим злом. Сама функция фина не имеет побочных эффектов. Тот факт, что он имеет побочные эффекты в реализации, не имеет значения. – mydogisbox