2015-10-04 122 views
3

我想基本上映射一個列表並同時攜帶一些狀態。我想結合名單和國家monads可能會讓我在那裏。我嘗試了幾件事情,發現我可能需要使用ListT。作爲我的實際問題的簡化版本,假設我想實現sum函數,同時還返回原始列表的修改版本。這或類似的是我想象它會看起來像:如何在Haskell中組合列表和狀態Monad

sum' :: ListT (State Int) Int 
sum' = do 
    lift $ put 0 
    x <- [1,2,3] 
    lift $ modify (+x) 
    return $ x + 1 

什麼我不明白而又在常規列表單子的語法如何轉化到ListT單子。我不能簡單地做x <- [1,2,3],因爲在箭頭的右側,預計輸入ListT (State Int) t0x <- return [1,2,3]編譯(如讓編譯器不要抱怨這一行),但讓我把整個列表放到x中,而不是每個元素。

我如何得到這個工作?

+0

想要'ssum xs = execState(遍歷(修改。(+))xs)0'嗎? – user3237465

+0

不幸的是,每當有人談論'ListT',你真的不得不問「哪一個?」因爲有幾個非常不同的版本表現得非常不同。 – dfeuer

回答

4
x <- ListT $ return [1,2,3] 

x <- msum $ return <$> [1,2,3] 

會做的伎倆。

  • ListT . return只是注入列表結構-awarely到一個列表轉化單子堆棧。

  • msum使用的事實,ListT是變壓器映射單子的自由MonadPlus幺過去。