如何使用List获得回溯和IO?

时间:2011-06-18 17:28:36

标签: haskell io generic-list backtracking monad-transformers

我真的不知道应该如何使用List转换器ListT。例如,如何完成这个简单的任务:

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

该功能的类型应该是什么?

这不是我想要完成的任务(我知道如何使用许多其他方法来解决这个问题),我只是想知道如何使用ListT来完成这些任务。

2 个答案:

答案 0 :(得分:4)

您应该查看ListT done right和回溯LogicT包。特别是logict中的interleave可以更好地处理无穷大。

答案 1 :(得分:3)

这是你想要做的吗?

import Control.Monad.List

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

在GHCi中运行示例:

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