2015-10-04 123 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幺过去。