문제

I have function f with signature f :: [a] -> StateT Int Reader b [c], and f' with signature f' :: a -> StateT Int Reader b [c]

The computation in f (very simplified) looks like that:

f [] = return []
f (s:st) = f' s >>= \x ->
           f st >>= \y ->
           return $ ...

And in place of the ... I would like to return the [c] part of x ++ the [c] part of y with the monad stuff wrapped around.
Is there a possibility to achieve that without manually unwrapping x and y and manually put the result together again? Do I need a List monad at the bottom of my monad stack to get simple code? The Reader Monad is obviously not an instance of the MonadPlus class.

도움이 되었습니까?

해결책

I don't get what you mean by unwrapping x and y.

I would have the last line as

return (x ++ y)

Do I misunderstand what you want?

다른 팁

You can also simply define

f = fmap concat . mapM f'

(mapM f' xs produces a value of type m [[c]], where xs :: [a] and m = StateT Int (Reader b), and then fmap concat concatenates the lists "inside the monad".)

Both f' s and f st are values in one monad, namely StateT Int Reader b. So you already have x :: [c] and y :: [c] and you just need to write return (x ++ y), as Dave Hinton said.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top