я был разочарован тем, что он правильно набрав:Haskell - почему он имеет правильные типы?
renumberTree2' :: Tree a -> StateT Int Identity (Tree Int)
renumberTree2' t = get >>= (\v -> return (Empty))
В конце концов, у нас есть что:
(>>=) :: m a -> (a -> m b) -> m b
. В связи с тем, что StateT s m a
мы не можем дать привязать get :: StateT s m s
. get не относится к типу m a
как и ожидалось.
Однако get s
, где s :: s->(a, s')
- правильный тип, который должен быть привязан. Где я ошибаюсь?
Мне казалось, что у монады всегда есть тип, это не означает 'm', всегда' m a' –
@HaskellFun Я думаю, что вы на 80% понимаете это полностью. Вот несколько моментов для дальнейшего изучения. Только типы с типом '*' могут иметь значения. Любой тип, который вы ожидаете получить, например, тот, который отображается справа от '->', должен иметь вид '*'. Монады имеют вид '* -> *', что означает, что вы должны дать им аргумент вида '*' для получения типа вида '*' out. Тем не менее, вы все равно можете использовать свою монаду 'm' самостоятельно в выражениях другого типа, например' MonadTrans t => t m a'. –