Haskell-为什么它有正确的类型?
我很失望,因为它可以正确地输入:Haskell-为什么它有正确的类型?,haskell,monads,Haskell,Monads,我很失望,因为它可以正确地输入: renumberTree2' :: Tree a -> StateT Int Identity (Tree Int) renumberTree2' t = get >>= (\v -> return (Empty)) 毕竟,我们有: (>>=)::MA->(a->MB)->MB。由于StateT s m a这一事实,我们不能给bindget::StateT s m s。get不是预期的绑定类型。MA。 但是,get s其中s::s->(
renumberTree2' :: Tree a -> StateT Int Identity (Tree Int)
renumberTree2' t = get >>= (\v -> return (Empty))
毕竟,我们有:(>>=)::MA->(a->MB)->MB
。由于StateT s m a
这一事实,我们不能给bindget::StateT s m s
。get不是预期的绑定类型。MA
。但是,
get s
其中s::s->(a,s')
是正确的类型,应该指定绑定。我错在哪里
毕竟,我们有:(>>=)::ma->(a->mb)->mb
对
get的类型不是[by]bind所期望的ma
不,get
属于ma
类型(尽管它带有约束)
毕竟,我们有:(>>=)::ma->(a->mb)->mb
对
get的类型不是[by]bind所期望的ma
不,
get
属于ma
类型(尽管它有一个限制)。您对类型的理解是错误的。您可以像对待具有优先权的函数一样对待更高级的类型(具有类型参数的类型)。如果你有一个函数
f :: a -> b -> c -> d -> e
f a b c d = undefined
那么叫它
let e = f a b c d
相当于
let e = (((f a) b) c) d
因为fa::b->c->d->e
,等等
当您看到类型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
这意味着所讨论的
Monad m'
是StateT s m
。一个以完全相同的方式工作的简单示例是Functor
的实例。具有函子
实例的不是或,而是或函子
,因为函子
是一个具有种类*->*
的类型,意思是一个只包含一个类型参数的类型。您在读取类型时弄错了。您可以像对待具有优先权的函数一样对待更高级的类型(具有类型参数的类型)。如果你有一个函数
f :: a -> b -> c -> d -> e
f a b c d = undefined
那么叫它
let e = f a b c d
相当于
let e = (((f a) b) c) d
因为fa::b->c->d->e
,等等
当您看到类型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
这意味着所讨论的Monad m'
是StateT s m
。一个以完全相同的方式工作的简单示例是Functor
的实例。不是或有一个函子
实例,而是或有一个
,因为函子
是一个带有种类*->*
的类型,意味着一个类型只需要一个类型参数。get
有类型ms
,其中s
是状态类型。StateT
的MonadState
实例具有上下文:
Monad m => MonadState s (StateT s m)
因此monad类型m
是StateT s m
。因此StateT
的get
类型为:
(StateT s m) s
对于某些结果类型b
,指定给(>>=)
的函数必须具有类型s->StateT s m b
return (Empty)
根据需要具有类型StateT s m(Tree Int)
,因为StateT s m
是单子。get
具有类型ms
,其中s
是状态类型。StateT
的MonadState
实例具有上下文:
Monad m => MonadState s (StateT s m)
因此monad类型m
是StateT s m
。因此StateT
的get
类型为:
(StateT s m) s
对于某些结果类型b
,指定给(>>=)
的函数必须具有类型s->StateT s m b
return (Empty)
根据需要输入StateT s m(Tree Int)
,因为StateT s m
是单子。在我看来,单子总是有类型,它意味着没有m
,总是ma
@HaskellFun我想你已经完全理解了80%。这里有几点需要你进一步研究。只有类型为*
的类型才能有值。您希望具有值的任何类型,例如出现在->
右侧的类型,必须是*
类型。monad有一种*->*
,这意味着您必须给它们一个*
类型的参数才能得到一种*
类型。但是,您仍然可以在其他类型表达式中单独使用monadm
,例如MonadTrans t=>tma
。在我看来,monad总是有类型,它意味着没有m
,总是ma
@HaskellFun我认为您已经完全理解了80%。这里有几点需要你进一步研究。只有类型为*
的类型才能有值。您希望具有值的任何类型,例如出现在->
右侧的类型,必须是*
类型。monad有一种*->*
,这意味着您必须给它们一个*
类型的参数才能得到一种*
类型。但是,您仍然可以在其他类型表达式中单独使用monadm
,例如MonadTrans t=>tma
。