Нужно ли мне понять, как Haskell представляет данные, чтобы иметь возможность написать хорошие программы Haskell?
-
27-09-2019 - |
Вопрос
Я учусь 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
выскакивает каждый из Cons
s в свою очередь; Следовательно, доступ к последнему элементу На), тогда как доступ к голову - постоянное время. После того, как вы можете сделать этот вид рассуждений о структурах данных на основе их определений, вы все находятся.
Другие советы
Краткий ответ - «Нет», вам не нужно знать о макетах данных - знание сложности будет полезно, хотя.
Для написания высокооптимированных программ Haskell, хорошие рабочие знания о форме структур данных в куче необходимы. Инструмент, чтобы помочь этому "Вакуум", который может представлять диаграммы структур данных Haskell, поскольку они выложены.
Некоторые примеры:
$ view "hello"
$ view (IntMap.fromList $ zip [1..10] [1..])
Вот короткое видео о том, как использовать инструмент: http://www.youtube.com/watch?v=x4-212UMGY8.