2011-06-18 5 views
4

Я не знаю, как именно должен использоваться преобразователь List ListT. Например, как должна выполняться эта простая задача:Как получить откат и ввод-вывод с использованием ListT?

backtrack :: ListT IO() 
backtrack = do 
    x <- lift getLine 
    a <- x 
    lift $ print a 

А какой должен быть тип функции?

Это не задача, которую я пытаюсь выполнить (я знаю, как решить эту проблему, используя многие другие методы), я просто хочу знать, как использовать ListT для выполнения таких задач.

+0

Какую задачу вы пытаетесь достичь? Вы на самом деле не говорите. –

+0

Я просто хочу понять, как использовать ListT, чтобы получить функции List Monad с IO. Что я на самом деле подразумевал под «Это не задача, которую я пытаюсь выполнить», так это то, что я не хочу решений для проблемы, которые не используют «ListT», потому что я уже знаю, как это сделать, используя «mapM» например. – is7s

+0

'a <- x' не имеет большого смысла, так как' x' имеет тип «monad», например, обычный 'a' в' m a'. Вероятно, вы хотите 'x <- liftGetline; лифт $ print a'? – alternative

ответ

3

Это то, что вы пытались сделать?

import Control.Monad.List 

backtrack :: ListT IO() 
backtrack = do 
    x <- ListT getLine 
    lift $ print x 

Пример работы в GHCi:

*Main> runListT backtrack 
foo 
'f' 
'o' 
'o' 
[(),(),()] 
+0

Да, это похоже на то, что я хочу. Но почему вы использовали конструктор 'ListT' в' x <- ListT getLine' should'nt 'lift' для использования во внутренних монадах? – is7s

+1

Вы также можете написать его как 'do x <- lift getLine; a <- ListT (return x); поднять $ print a'. Возможно, это проще понять. – hammar

+0

Спасибо @hammar Ваш вклад был действительно полезен – is7s

4

Вы должны смотреть на ListT done right и возвратов LogicT пакетов. В частности, interleave в логике обрабатывает бесконечности лучше.