2011-06-18 52 views
4

我不知道如何使用列表變形器ListT。例如,如何完成這個簡單的任務:如何使用ListT獲取回溯和IO?

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

而應該是什麼類型的函數?我不知道如何使用ListT來完成這樣的任務。

+0

你想完成什麼任務?你其實並沒有說。 –

+0

我只是想了解如何使用ListT來獲取帶有IO的List Monad的功能。 我的意思是「這不是我想要完成的任務」,我不想爲不使用'ListT'的問題提供解決方案,因爲我已經知道如何使用'mapM'來完成這個任務例如。 – is7s

+0

'a <-x'沒有多大意義,因爲'x'是「單子類型」,例如,'m a'中的正常'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

是的,這與我想要的類似,但是爲什麼你在'x < - ListT getLine'中使用'ListT'構造函數'should'nt'lift'用於內部monad中的動作? – is7s

+1

你也可以把它寫成'do x < - lift getLine; a < - ListT(return x); lift $ print a'。或許這樣更容易理解 – hammar

+0

謝謝@hammar 您的貢獻真的很有用 – is7s