Как получить возврат и IO, используя ListT? - PullRequest
4 голосов
/ 18 июня 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

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

3 голосов
/ 18 июня 2011

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

import Control.Monad.List

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

Пример выполнения в GHCi:

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