Дикт против записи в вязе - PullRequest
0 голосов
/ 18 ноября 2018

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

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

Просмотр словарей и записей рядом друг с другом заставил меня задуматься: зачем мне использовать запись вместо словаря или наоборот? Эти два кажутся действительно похожими на меня, поэтому я не уверен, что вижу преимущество одного или другого. Конечно, я вижу разницу в синтаксисе, но это все?

Я где-то узнал, что сложность времени доступа для Dict - O (log (n)) - выполняет ли он двоичный поиск по ключам? - но я не могу найти сложность времени доступа для записи, но мне интересно, если это O (1), и это одно из преимуществ.

В любом случае, они оба, кажется, отображают одну единую структуру данных на других языках (например, словари Python, объекты JS, хеш-таблицы Java), зачем нам два в elm?

1 Ответ

0 голосов
/ 18 ноября 2018

Dict s и записи могут показаться очень похожими, если исходить из JavaScript, но в статически типизированном языке они на самом деле очень разные. Я думаю, что единственное их общее свойство - это то, что они оба являются контейнерами ключ-значение.

Самым большим отличием, я думаю, является то, что Dict s являются однородными, что означает, что значения должны быть одного типа, и «динамически» имеет ключ и размер, то есть ключи не проверяются статически (т. Е. Во время компиляции) и что пары ключ-значение могут быть добавлены во время выполнения. Записи, с другой стороны, включают имена ключей и типы значений в типе записи, что означает, что они могут содержать значения различных типов, но также не могут иметь ключи, добавляемые или удаляемые во время выполнения, без изменения самого типа.

Преимущества простоты возможности вставки и обновления Dict - это то, за что вы платите, когда пытаетесь вернуть его обратно. Dict.get возвращает Maybe, с которым вам потом придется работать, потому что тип не дает никакой гарантии, что он вообще содержит что-либо. Вы также не получите ошибку компилятора, если неправильно наберете имя ключа.

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

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

...