我对它正确输入的事实感到失望:
renumberTree2' :: Tree a -> StateT Int Identity (Tree Int)
renumberTree2' t = get >>= (\v -> return (Empty))
Run Code Online (Sandbox Code Playgroud)
毕竟,我们有:
(>>=) :: 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') 是正确的类型,应该给予绑定.我哪里错了?
你错误地阅读了这些类型.您可以像处理优先级的函数一样处理更高级的kinded类型(具有类型参数的类型).如果你有一个功能
f :: a -> b -> c -> d -> e
f a b c d = undefined
Run Code Online (Sandbox Code Playgroud)
然后调用它
let e = f a b c d
Run Code Online (Sandbox Code Playgroud)
相当于
let e = (((f a) b) c) d
Run Code Online (Sandbox Code Playgroud)
等f a :: b -> c -> d -> e,以及(f a) b等等
当你看到类型时StateT s m a,你也可以读它((StateT s) m) a,类型是等价的,GHC会很乐意接受这种语法.通过这种方式,可以更容易地看到如何Monad m => StateT s m a与之对齐Monad m' => m' a':
m' ~ StateT s m
a' ~ a
Run Code Online (Sandbox Code Playgroud)
这意味着Monad m'问题在于StateT s m.以完全相同的方式工作的更简单的示例是Functorfor 的实例Either a.它不Either具有Functor实例,但是Either a,因为a Functor是具有种类的类型* -> *,意味着只接受一个类型参数的类型.