2

次の 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で同じことをどのように行いますか?

4

2 に答える 2