Я не знаю, как я могу внести условное изменение в State Monad в Haskell. Допустим, у меня есть стек на State Monad.
import Control.Monad.State
push :: Int -> State [Int] ()
push x = state $ \xs -> ((), x : xs)
pop :: State [Int] Int
pop = state $ \(x : xs) -> (x, xs)
И с этим я хочу написать функцию, изменяющую его.
someFunc :: Bool -> Int -> State [Int] ()
someFunc b x = do
let someValue = x * x
if b then
p <- pop
someValue = someValue + p
push $ someValue
Например, я хочу взять логическое значение b
и значение x
. И если b
равно True
(например, это может быть условие, что мой стек не пуст), я хочу pop
значение из моего стека и добавить его в какую-то переменную. В противном случае я ничего не добавляю в переменную и просто помещаю ее в стек.
Как я могу добиться такого поведения?