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