Если вы пишете алгоритм биоинформатики в Haskell, вы, вероятно, будете использовать тип алгебраических данных для представления нуклеотидов:
data Nucleotide = A | T | C | G
Вы бы сделали аналогично в стандартном ML или OCaml, я предполагаю (я никогда не использовал его).
Значение типа Nucleotide может содержаться в двух битах. Тем не менее, это приведет к тому, что время доступа будет медленнее, чем если бы вы использовали один байт за значение Nucleotide, так как вам нужно было бы выбрать два бита интереса, используя двоичные операторы.
Следовательно, существует неотъемлемый компромисс, который компилятор должен делать между эффективностью памяти и вычислительной эффективностью при принятии решения о том, как представлять алгебраические типы данных. Более того, представление алгебраических типов данных в памяти усложняется тем, что значение может иметь переменный размер:
data Maybe a = Just a | Nothing
Очевидно, что значение Maybe a формы Just a логически больше значения формы Nothing. В крайнем примере:
data Hulk a b c d e = Big a b c d e | Little
вам определенно не захочется хранить в нулевых указателях значения Little или нулевые значения для пяти значений, содержащихся в значениях Big. Я предполагаю, что вы просто используете выделенную кучу память с переменным размером с идентификатором конструктора в начале (например, 0 для Big и 1 для Little). Однако, если вы хотите сохранить значения Hulk в стеке (более быстрое представление), вам нужно сохранить пустую память вместе с значениями Little, чтобы все значения типа Hulk были одинакового размера. Другой компромисс.
Саймон Марло ответил на мой общий вопрос в отношении GHC в qaru.site/info/3240/.... Однако у меня есть три связанных вопроса, которые остаются без ответа:
- Используют ли стандартные ML (SML/NJ и MLton) и OCaml ту же технику?
- Если да, то какие-либо менее распространенные компиляторы этих языков (или их братьев и сестер) экспериментируют с другими методами?
- Есть ли достаточно простой способ (в идеале - флаг прагмы или флажка) на этих языках использовать более эффективное представление памяти, например двухбитное представление
Nucleotide? Такая эффективность памяти необходима для многих применений биоинформатики; если каждыйNucleotideдолжен был быть одним байтом, высокопроизводительные алгоритмы биоинформатики должны были бы прибегать к ручному путанию.