Обработка значений IO в haskell - PullRequest
3 голосов
/ 29 июля 2011

Я пишу небольшую программу с действиями ввода-вывода в Haskell здесь

module StackQuestion where

import Data.Map (Map, insert, fromList)

type Name = String
type Value = String

readValue :: Name -> IO String
readValue name = do     putStrLn name
                        value <- getLine
                        return value

addPair :: Name -> Value -> Map Name Value -> Map Name Value
addPair = insert

names = map show [1..5]
values = map (\char -> [char]) ['a'..'d']
initialMap = fromList (zip names values)

Как видите, у меня есть некоторая начальная карта со значениями и функция, которая добавляет пару к карте, функции, которые считывают значение.

Как я могу получить чистое значение String из readValue и передать его другой функции?

Или я должен изменить type Value = String на type Value = IO String и использовать карту Map String (IO String)?

И если у меня есть Map String (IO String) как я могу обработать эту карту, как я могу получить любое значение, зависящее от данных в IO контейнере (может быть, какая-то функция func :: (a->b) -> IO a -> b) Например, есть ли способ сравнить IO String с clear String?

Если бы у меня была функция func, я бы написал

map :: Map String (IO String)
...
func (==) (map ! "key")

Какова стратегия работы с IO значениями?

1 Ответ

7 голосов
/ 29 июля 2011

Как я могу получить чистое значение String из readValue и передать его другой функции?

Ты не можешь; вам придется манипулировать результатом readValue, находясь в монаде IO.

{- read value for name and store both in map -}
readAndStore :: Name -> Map Name Value -> IO (Map Name Value)
readAndStore name m  =  do value <- readValue name
                           return $ insert name value m

Функция return берет результат insert и аккуратно помещает его обратно в монаду IO. Этот код иллюстрирует общий шаблон для манипулирования значениями с обычными функциями внутри IO.

Или я должен изменить type Value = String на type Value = IO String

Нет; подумайте, что бы это значило. IO String означает вычисление с возможными побочными эффектами (IO) с результатом String. Вы будете отображать имена для вычислений. (Это возможно, но это не то, что вы имеете в виду.)

В приведенном выше примере вместо этого используется IO (Map Name Value); то есть вычисление в монаде IO с результатом Map.

...