Это contrieved пример использования считывателя Transformer:Получение внутри монады, завернутой в трансформаторе
{-# LANGUAGE UnicodeSyntax #-}
import Control.Monad.Reader
import Data.Char
conv ∷ Int → ReaderT Char Maybe String
conv n = do
yn ← ask
if yn == 'y'
then return $ chr n : " with Yes"
else lift Nothing
-- runReaderT (conv 98) 'y' Just "b with Yes"
-- runReaderT (conv 98) '@' Nothing
inspect ∷ ReaderT Char Maybe String → Bool
- Редакция: согласно предложениям, правильный типа монадический:
inspect ∷ ReaderT Char Maybe String → ReaderT Char Maybe Bool
inspect
предполагается чтобы проверить, является ли значение внутри Nothing. Можно ли это сделать, или у меня «проблемы с дизайном»?
Вы не можете проверить значение без запуска считывателя, так как ответ зависит от значения в окружающей среде. – Lee
Конечно нет. Я предполагал, что «runReaderT проверяет ...» где-то рядом. – punund
что Ли означает, что вы хотите 'проверять :: ReaderT Char Может быть, String -> ReaderT Char Возможно, Bool' - подпись, которую вы дали, в основном может дать только константу (она может кормить' Читателя' своей собственной средой/'Char 'и т.д.) – Carsten