Как Вы объявляете значения словарной статьи как изменяемые?

Рассмотрите пересмотр Вашего дизайна. Поддержание так большого количества состояния в Вашем веб-сервере является, вероятно, плохой идеей. Мультипроцесс является намного лучшим способом пойти для устойчивости.

там другой способ совместно использовать состояние между отдельными процессами? Что относительно сервиса? База данных? Индекс?

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

12
задан abatishchev 13 March 2014 в 04:02
поделиться

2 ответа

f # имеет две общие ассоциативные структуры данных:

Та, к которой вы больше всего привыкли, изменяемый словарь, который он наследует от своего присутствия в BCL и использует хэш-таблицу под капотом.

let dict = new System.Collections.Generic.Dictionary<string,int>()
dict.["everything"] <- 42

Другой известен как Карта и в общем функциональном стиле является неизменяемым и реализуется с помощью бинарных деревьев.

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

let withDouglasAdams = Map.add "everything" 42 Map.empty

Значение withDouglasAdams навсегда останется как ассоциация «всего» с 42. поэтому, если вы сделаете это позже:

let soLong = Map.remove "everything" withDouglasAdams

Тогда эффект этого ' удаление 'видно только через значение soLong .

Карта F #, как уже упоминалось, реализована как двоичное дерево. Таким образом, поиск - O (log n), тогда как (хорошо управляемый) словарь должен быть O (1). На практике словарь на основе хэша будет иметь тенденцию превосходить словарь на основе дерева почти во всех простых (небольшое количество элементов, низкая вероятность коллизии), поскольку таковой обычно используется. При этом неизменяемый аспект карты может позволить вам использовать его в ситуациях, когда словарь вместо этого потребует более сложной блокировки или для написания более «элегантного» кода с меньшим количеством побочных эффектов, и, таким образом, он остается полезной альтернативой.

но не источник вашей проблемы. Оператор dict возвращает явную неизменяемую реализацию IDictionary (несмотря на то, что в нем это не указано. s документация).

Из fslib-extra-pervasives.fs (обратите внимание также на использование параметров для ключей):

let dict l = 
    // Use a dictionary (this requires hashing and equality on the key type)
    // Wrap keys in an Some(_) option in case they are null 
    // (when System.Collections.Generic.Dictionary fails). Sad but true.
    let t = new Dictionary<Option<_>,_>(HashIdentity.Structural)
    for (k,v) in l do 
        t.[Some(k)] <- v
    let d = (t :> IDictionary<_,_>)
    let c = (t :> ICollection<_>)
    let ieg = (t :> IEnumerable<_>)
    let ie = (t :> System.Collections.IEnumerable)
    // Give a read-only view of the dictionary
    { new IDictionary<'key, 'a> with 
            member s.Item 
                with get x = d.[Some(x)]            
                and  set (x,v) = raise (NotSupportedException(
                                            "This value may not be mutated"))
   ...
27
ответ дан 2 December 2019 в 04:43
поделиться

Какую ошибку вы получаете? Я попробовал следующее, и он отлично компилируется

let map = new System.Collections.Generic.Dictionary<string,int>()
map.["foo"] <- 42

РЕДАКТИРОВАТЬ Убедитесь, что этот код также работает нормально.

5
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

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