Нужно ли мне понять, как Haskell представляет данные, чтобы иметь возможность написать хорошие программы Haskell?

StackOverflow https://stackoverflow.com/questions/3862144

Вопрос

Я учусь Haskell с фона Java. Когда я программирую Java, я чувствую, что у меня есть сильное понимание того, как объекты выложены в память и последствия этого. Например, я точно знаю, как java.lang.String а также java.util.LinkedList Работа и поэтому я знаю, как я должен их использовать. С haskell я немного потерян. Например, как (:) работай? Должен ли я заботиться? Это где-то указано?

Это было полезно?

Решение

Короткий ответ: нет. При программировании в Haskell вы должны подумать о ваших структурах данных как чистых математических объектов и не беспокоиться о том, как они представлены в памяти. Причина этого в том, что при отсутствии побочных эффектов на самом деле ничего нет к Данные, кроме функций, которые создают его, и функции, которые вы можете использовать для извлечения более простых частей, из которых она была построена.

Чтобы увидеть информацию о конструкторах данных, как (:), или любые другие условия, используйте :type (или просто :t Для короткой) командование внутри GHCI:

:Prelude> :type (:)
(:) :: a -> [a] -> [a]

Это говорит вам, что (:) Конструктор (произносится «минусы»), принимает значение любого типа и список того же типа и возвращает список того же типа. Вы также можете получить немного больше информации, используя :info команда. Это покажет вам, как выглядит определение данных:

Prelude> :info (:)
data [] a = ... | a : [a]   -- Defined in GHC.Types
infixr 5 :

Это говорит вам, что (:) это конструктор, который добавляет элемент в существующий список.

Я также очень рекомендую Добыча не только для поиска вещей по имени, но для выполнения обратного вида поиска; Где вы знаете подпись функции, которую вы ищете и хотите найти, если кто-то уже написал это для вас. Hoogle приятно, потому что он дает описания и пример использования.

Формы индуктивных данных

Вы сказали выше, что не важно знать представление ваших данных в памяти ... Вы должны, однако, понять форма данных, с которыми вы имеете дело, чтобы избежать плохих решений по производительности. Все данные в Haskell индуктивно определены, что означает, что у нее есть форма, подобная дереву, которая разворачивается всегда наружу. Вы можете сказать форму данных, глядя на его определение; Там действительно ничего скрыто о его характеристиках производительности, как только вы знаете, как прочитать это:

data MyList a = Nil | Cons a (MyList a)

Как вы можете видеть из определения, единственный способ получить новый MyList это по Cons конструктор. Если вы используете этот конструктор несколько раз, вы получите что-то примерно из этой формы:

(Cons a5 (Cons a4 (Cons a3 (Cons a2 (Cons a1 Nil)))))

Это просто дерево без ветвей, это определение списка! И единственный способ получить в a1 выскакивает каждый из Conss в свою очередь; Следовательно, доступ к последнему элементу На), тогда как доступ к голову - постоянное время. После того, как вы можете сделать этот вид рассуждений о структурах данных на основе их определений, вы все находятся.

Другие советы

Краткий ответ - «Нет», вам не нужно знать о макетах данных - знание сложности будет полезно, хотя.

Для написания высокооптимированных программ Haskell, хорошие рабочие знания о форме структур данных в куче необходимы. Инструмент, чтобы помочь этому "Вакуум", который может представлять диаграммы структур данных Haskell, поскольку они выложены.

Некоторые примеры:

$ view "hello"

linked lists

$ view (IntMap.fromList $ zip [1..10] [1..])

Data.IntMap

Вот короткое видео о том, как использовать инструмент: http://www.youtube.com/watch?v=x4-212UMGY8.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top