Является ли монада состояния с двумя типами переменных состояния (входной и исходящей) по-прежнему монадой?

Монада состояния 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 в качестве эталона. Я просто не хочу, чтобы позже это нарушило другие вещи, где я ожидаю применения законов монад.


person Juan    schedule 03.09.2015    source источник


Ответы (1)


Вам нужна индексированная монада. См., например. определение в category-extras:

определение индексированной монады:

class IxApplicative m => IxMonad m where
  ibind :: (a -> m j k b) -> m i j a -> m i k b

монада с индексом состояния:

class IxMonad m => IxMonadState m where
  iget :: m i i i
  iput :: j -> m i j ()
person gallais    schedule 03.09.2015
comment
На самом деле это именно так. По-видимому, на самом деле это не монада, а что-то близкое, но, поскольку она имеет точно такую ​​​​же реализацию, что и монада состояния, я не вижу, как это может нарушить какое-либо из правил монады или привести к каким-либо неожиданным результатам. - person Juan; 04.09.2015