Монада состояния Haskell State s a
заставляет меня сохранять один и тот же тип s
на протяжении всего блока do. Но поскольку монада состояния на самом деле является просто функцией, что, если я определю ее как State i o a = State (i -> (o, a))
?. Функции return
и bind
будут выглядеть точно так же, как в монаде стандартного состояния, но с измененными типами:
return :: a -> State st st a
bind :: (State i o a) -> (a -> (State o o' b)) -> (State i o' b)
Я не думаю, что возможно реализовать Monad
в Haskell, используя это определение, потому что он ожидает один тип State i o
в привязке (только a
может измениться). Но этот вопрос не о Haskell, а о том, будет ли это технически монадой или нет. Или, если нет, то будет ли это своего рода надмножеством монады (таким, что все законы монады все еще применяются, но имеют некоторые дополнительные функции)?
Это то, что я нашел полезным для другого языка, над которым я работаю, который основан на лямбда-исчислении, поэтому я использую Haskell в качестве эталона. Я просто не хочу, чтобы позже это нарушило другие вещи, где я ожидаю применения законов монад.