Data.ConfigFile не использует экземпляр Bool для получения

Согласно https://hackage.haskell.org/package/ConfigFile-1.0.5/docs/Data-ConfigFile.html, пакет преобразует значение в config. файл в Bool. Следующий код:

{-# LANGUAGE FlexibleContexts #-}


import qualified Data.ConfigFile as DC
import qualified Control.Monad.Except as CME


-- | The foundation object
data JRState = JRState {
        secureOnly :: Bool  -- ^ restrict connections to HTTPS
    }


main :: IO ()
main = (CME.runExceptT $ pipe (JRState False)) >>= estate


estate :: Show t => Either t JRState -> IO ()
estate (Right state) = return ()
estate (Left err) = do
    putStrLn $ "<<" ++ show err ++ ">>"
    return ()


pipe :: (CME.MonadError DC.CPError m, CME.MonadIO m) => JRState -> m JRState
pipe site = do
    cp <- CME.join $ CME.liftIO $ return $ DC.readstring DC.emptyCP{DC.optionxform=id} "secureSession = True\n"
    DC.get cp "DEFAULT" "secureSession" >>= return . nubb where
        nubb (Left err) = error err
        nubb (Right value) = site{secureOnly = value}

при запуске производит

‹‹(ParseError "не удалось проанализировать значение True из (DEFAULT/secureSession)", "genericget")>>

что, очевидно, произошло из-за состояния putStrLn. Но я ожидаю, что извлечение значения в канале и куске (я знаю, глупые имена) вызовет логический контекст и, таким образом, вызовет преобразование строки True в Bool. Я пробовал 1 и Да с тем же результатом. В чем дело?


person Michael restore Monica Cellio    schedule 23.04.2015    source источник
comment
Шаг 1: сократите свой код до наименьшего возможного фрагмента, который все еще вызывает эту ошибку. Бьюсь об заклад, вы можете создать это сообщение всего в одной строке кода, состоящего, скажем, из 20 лексем, если вы постараетесь. Это значительно уменьшит объем работы, которую должен будет выполнить специалист по библиотеке ConfigFile, чтобы помочь вам, и повысит вероятность того, что вы получите помощь.   -  person Daniel Wagner    schedule 23.04.2015
comment
ОК, исходный вопрос переработан с минимальным автономным образцом. Но все же чуть больше 20 лексем.   -  person Michael restore Monica Cellio    schedule 24.04.2015


Ответы (1)


Вот более минимальная программа с таким же проблемным поведением:

import qualified Data.ConfigFile as DC
import qualified Control.Monad.Except as CME

main = CME.runExceptT pipe >>= print
pipe = do
    cp <- DC.readstring DC.emptyCP{DC.optionxform=id} "secureSession = True\n"
    DC.get cp "DEFAULT" "secureSession" >>= nubb

nubb :: Either String Bool -> m Bool
nubb = undefined

Когда он урезан до такой формы, становится очевидным, что пошло не так: вы просите DC.get вернуть Either String Bool, тогда как на самом деле вы должны просто попросить его вернуть Bool. Простое исправление для урезанной версии состоит в том, чтобы полностью удалить часть >>= nubb этой строки; должно быть легко перевести это исправление обратно в ваш более широкий контекст.

person Daniel Wagner    schedule 24.04.2015