LINUX.ORG.RU

История изменений

Исправление red75prim, (текущая версия) :

ReaderT протягивает состояние по умолчанию, а вот менять его нужно явно.

first :: a -> ReaderT Config IO a
first a = do
    return ...

second :: a -> a -> ReaderT Config IO a
second a b = do
    return ...

myFunc :: a -> a -> ReaderT Config IO a
myFunc a b = do
    liftIO $ ... // Сделать что-то в IO монаде
    liftIO $ ... // Сделать ещё что-то в IO монаде
    config <- ask
    result <- 
        if some_condition config 
            // first использует ту же конфигурацию что и my_func
            then first ... 
            // меняем конфигурацию для second
            else local (changeConfigFunc) $ second ...
    return result

main = do
    ...
    config <- readConfigFromFile
    ...
    result <- runReaderT (myFunc ...) config

В коде могут быть ошибки. Давно с Haskell дела не имел.

Исходная версия red75prim, :

ReaderT протягивает состояние по умолчанию, а вот менять его нужно явно.

first :: a -> ReaderT Config IO a
first a = do
    return ...

second :: a -> a -> ReaderT Config IO a
second a b = do
    return ...

myFunc :: a -> a -> ReaderT Config IO a
myFunc a b = do
    config <- ask
    result <- 
        if some_condition config 
            // first использует ту же конфигурацию что и my_func
            then first ... 
            // меняем конфигурацию для second
            else local (changeConfigFunc) $ second ...
    return result

main = do
    ...
    config <- readConfigFromFile
    ...
    result <- runReaderT (myFunc ...) config

В коде могут быть ошибки. Давно с Haskell дела не имел.