【发布时间】:2014-04-06 09:19:19
【问题描述】:
考虑以下 Haskell 代码:
import Control.Monad.State
test :: Int -> [(Int, Int)]
test = runStateT $ do
a <- lift [1..10]
modify (+a)
return a
main = print . test $ 10
这会产生以下输出:
[(1,11),(2,12),(3,13),(4,14),(5,15),(6,16),(7,17),(8,18),(9,19),(10,20)]
但是我想生成以下输出:
[(1,11),(2,13),(3,16),(4,20),(5,25),(6,31),(7,38),(8,46),(9,55),(10,65)]
这在 JavaScript 这样不纯的语言中很容易做到:
function test(state) {
var result = [];
for (var a = 1; a <= 10; a++) {
result.push([a, state += a]);
}
return result;
}
你如何在 Haskell 中做同样的事情?
【问题讨论】:
标签: haskell monads monad-transformers state-monad non-deterministic