Haskell, получить значение из хеш-таблицы - PullRequest
1 голос
/ 30 октября 2011

Я использую new (==) hashInt, который возвращает значение типа IO (HashTable key val), так ли это, что я могу только выполнять поиск / вставку внутри монады ввода-вывода?

Если это так, какя могу получить чистые данные из HashTable для использования в чистой функции?НапримерУ меня есть функция, которая принимает HashTable и ключ в качестве параметров и должна возвращать значение, индексированное этим ключом ...

Я действительно спотыкаюсь о работе с Hashtables, потому что я не могу получить значенияиз монады IO.Это вообще возможно?

Ответы [ 2 ]

3 голосов
/ 30 октября 2011

это тот случай, когда я могу выполнять поиск / вставку только внутри монады ввода-вывода?

Да

Я действительно спотыкаюсь о работе с Hashtables, потому что не могу получить значения из монады IO. Это вообще возможно?

Количество

Чистые значения неизменны. Этот Hashtable, как и большинство хеш-таблиц, является mutable контейнером. Это означает, что ваша программа может использовать Hashtable, только внимательно следя за порядком выполнения всех команд. Чтобы быть полезным при управлении порядком выполнения, язык Haskell предоставляет монады IO (или ST) и синтаксический сахар (запись «do») для написания вашего кода.

Чтение и запись в Hashtable являются обеими командами выполнения и не используют чистый синтаксис привязки «let». Таким образом, при чтении из HashTable обычно используется "<-" в нотации "do", как в примере с vivian. </p>

Примечание: Использование Data.Map.Map позволит вам иметь что-то, что также позволяет вставлять и искать, но чисто.

2 голосов
/ 30 октября 2011

Цель монады IO - бороться с побочными эффектами.Вам необходимо вызывать свои чистые функции в монаде IO, если вы используете данные «внутри» IO.

Вам необходимо вызывать чистые функции в монаде IO.

doSomethingWithHashTable :: HashTable key val -> key -> Maybe val
-- this is the pure function that you sequence within the `IO` monad

main :: IO ()
main = do
    ...
    hashtable <- new (==) hashInt
    hashtable' <- return $ doSomethingWithHashtable hashtable
    ...

РЕДАКТИРОВАТЬ Как указано в комментариях, все hashtable функции нечисты.

doSomethingWithHashTable :: HashTable key val -> IO Bool
doSomethingwithHashtable ht = do
    insert ht 1
    r <- lookup ht 1
    case r of
       Just _   -> return True
       NOhting  -> return False

main = do
    ...
    hashtable <- new (==) hashInt
    result <- doSomethingWithHashTable hashtable
    ...
...