Итак, для задания, которое мне было предоставлено, у меня было три функции для завершения: для извлечения HCodeMap из каждого листового узла данного дерева для кодирования строки в список битов, и декодировать эту строку бит обратно в строку.Haskell - Huffman Декодирование без дерева
Я успешно завершил функции извлечения и кодирования кода, но я изо всех сил пытаюсь добиться прогресса с последней функцией декодирования, поскольку нам не разрешено пересекать дерево, поскольку нам не дано использовать его.
Это формат функции, а затем некоторые из типов мы снабжаются:
decode :: [Bit] -> HCodeMap -> Maybe String
data Bit = Zero | One deriving (Show, Eq)
type HCodeMap = [(Char, [Bit])]
Первоначально я пытался создать свою собственную функцию поиска, которая будет поменять значения HCodeMap, а затем для поиска первых n бит из списка битов, которые мы даем.
Я буду использовать пример, чтобы продемонстрировать, если я не сделал себе очень ясно:
[Бит] заданы: [один, ноль, один, один, ноль]
HCodeMap мы даем: [('c', [Zero]), ('a', [One, Zero]), ('b', [One, One])]
Я планировал взять первый бит, мы получаем из списка, являющегося одним, а затем для поиска через HCodeMap-тестирование, чтобы убедиться, что он был равен любому из [бит].
Здесь я бы включил функцию обратного поиска, так как я мог искать список бит внутри HCodeMap, поскольку я не могу искать по букве. Это было по линии:
поиска (биты мы приведены здесь) (каждый кортеж HCodeMap) $ Карта замены кода
В этом случае мы видим, что один не соответствует ни одному из HCodeMap кортежи, поэтому я затем тестирую One, Zero. Это соответствует «a», поэтому я добавляю «a» к строке, а затем продолжаю со следующего [Бит], который мы передаем, будучи снова одним.
и т. Д. И т. Д. Это продолжается, и мы остаемся со строкой «abc».
Я действительно борется с тем, как на самом деле положить это в функцию.
Надеюсь, я не сделал это слишком запутанным, спасибо за любую помощь заранее!
Почему не просто восстановить дерево из 'HCodeMap'? –
К сожалению, для всех наших функций создания дерева требуется строка для ввода, а также нам было предложено не воссоздавать все из них с помощью другого ввода. – Gavin89