Использование очередей в haskell (модуль) - PullRequest
3 голосов
/ 18 января 2012

У меня есть вопрос относительно этого кода на Haskell:

module Queue (Queue, emptyQueue, queueEmpty, enqueue, dequeue, front) where

newtype Queue a = MakeQ([a])

emptyQueue :: Queue a
emptyQueue = MakeQ([])

queueEmpty :: Queue a -> Bool
queueEmpty (MakeQ(q)) = null q

enqueue :: a -> Queue a -> Queue a
enqueue x (MakeQ(q)) = MakeQ(q ++ [x])

dequeue :: Queue a -> Queue a
dequeue (MakeQ(x:q)) = MakeQ(q)

front :: Queue a -> a
front (MakeQ(x:q)) = x

Я знаю, как обычно работает очередь и что в основном делает каждая из операций.Моя первая проблема в том, что я не знаю, как использовать операции в объятиях.Как мне создать пустую очередь или поместить в нее элемент после того, как я его создал?Я попробовал несколько команд, но все они приводили к сообщениям об ошибках, например, Make ([]), emptyQueue [] ... Я знаю, что эти команды очень наивны, но я абсолютно не знаком с Haskell и нуждаюсь в нем только в течение 2 недельили около того.

Второй вопрос касается самого "MakeQ".Это просто объявление имени нашей операции, верно?Или это статическая команда на Haskell?Imo это может быть также "QQQ" или что-то еще.Я не могу на самом деле проверить, приведет ли это к краху программы или нет, потому что я не знаю, как использовать этот модуль.

Даже если мой вопрос покажется глупым, я был бы очень рад, если бы кто-то мог датьмне объяснение или намеки ...

1 Ответ

6 голосов
/ 18 января 2012

emptyQueue сама по себе пустая очередь;вам не нужно передавать ему какие-либо параметры.

MakeQ - это произвольное имя, вы правы;это может быть что угодно (если вы изменили все другие варианты его использования).В данном случае это конструктор для Queue: если xs является списком a значений (то есть имеет тип [a]), то MakeQ xs является Queue a.Однако модуль не экспортирует MakeQ, поэтому его нельзя использовать извне - он используется как часть реализации и скрыт для поддержки абстракции;его можно легко переписать с точки зрения другой структуры, не относящейся к списку, без нарушения кода, использующего модуль.

Операции с очередью выполняются не путем обновления существующей очереди на месте, а с помощью * 1016.* преобразование очереди в новые очереди.Например, если a - это Int, а q - это Queue Int, тогда enqueue a q - это еще один Queue Int с добавлением a на оборотной стороне.Точно так же, если q - это Queue Int, то dequeue q - это еще один Queue Int без переднего элемента, а front q - это сам передний элемент (Int).

Также,обратите внимание, что Hugs больше не поддерживается;вам следует подумать об установке Haskell Platform , основанной на компиляторе GHC.Он содержит программу-интерпретатор, как и Hugs, поэтому это не просто стандартный компилятор.

Вот пример того, как этот модуль очереди можно использовать из интерактивного приглашения:

GHCi> let q = emptyQueue :: Queue Int
GHCi> let q1 = enqueue 42 q
GHCi> front q1
42
GHCi> let q2 = enqueue 43 q1
GHCi> front q2
43
GHCi> front (dequeue q2)
42

Если вы пытаетесь поддерживать очередь на протяжении всего выполнения программы, то, вероятно, вы захотите использовать монаду state , которая намного менее страшна, чем кажется.:) Я бы порекомендовал прочитать Learn You a Haskell , который является отличным учебным пособием по Haskell, охватывающим, помимо прочего, монаду состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...