Чтобы понять, как использовать трансформаторы монады, я написал следующий код без него. Он читает стандартный ввод строки за строкой и отображает каждую строку в обратном порядке до тех пор, пока не встретится пустая строка. Он также подсчитывает строки с использованием State
и в конце отображает общее число.Используйте две монады без трансформатора
import Control.Monad.State
main = print =<< fmap (`evalState` 0) go where
go :: IO (State Int Int)
go = do
l <- getLine
if null l
then return get
else do
putStrLn (reverse l)
-- another possibility: fmap (modify (+1) >>) go
rest <- go
return $ do
modify (+1)
rest
Я хотел бы добавить текущий номер строки перед каждой строкой. Я был в состоянии сделать это с StateT
:
import Control.Monad.State
main = print =<< evalStateT go 0 where
go :: StateT Int IO Int
go = do
l <- lift getLine
if null l
then get
else do
n <- get
lift (putStrLn (show n ++ ' ' : reverse l))
modify (+1)
go
Мой вопрос: как сделать то же самое в версии без монада трансформаторов?
Я это понимаю. Я не ищу версию без трансформатора монады для эффективности, я просто хочу посмотреть, как это будет выглядеть, и научиться чему-то, сравнив эти два, надеюсь, лучше понять необходимость в монадных трансформаторах. – ByteEater
Кроме того, выполнение вычислений накопленных состояний в каждой строке является тем, что я рассматривал и отклонял именно по этой причине: он не кажется правильным способом использования монадов, простой «Int» был бы лучшим выбором. Более того, с инкрементацией это не имеет никакого значения, но это было бы неправильно концептуально, так как вычисление 'State' строится путем добавления действий' modify (+1) ', поэтому, если бы у меня было, например, 'modify (+ length l)', это не сработало бы так, как должно. – ByteEater
@ByteEater, способ сделать это без трансформатора монады - просто передать «Int» вручную (раздражает) или использовать «IORef» (ограниченный «IO» -подобными вещами и потенциально неэффективным, но хорошо, если коробка неизбежна или обновления встречаются редко). Я не знаю, что еще вы ищете. – dfeuer