Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-为什么它有正确的类型?_Haskell_Monads - Fatal编程技术网

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
这一事实,我们不能给bind
get::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有一种
*->*
,这意味着您必须给它们一个
*
类型的参数才能得到一种
*
类型。但是,您仍然可以在其他类型表达式中单独使用monad
m
,例如
MonadTrans t=>tma
。在我看来,monad总是有类型,它意味着没有
m
,总是
ma
@HaskellFun我认为您已经完全理解了80%。这里有几点需要你进一步研究。只有类型为
*
的类型才能有值。您希望具有值的任何类型,例如出现在
->
右侧的类型,必须是
*
类型。monad有一种
*->*
,这意味着您必须给它们一个
*
类型的参数才能得到一种
*
类型。但是,您仍然可以在其他类型表达式中单独使用monad
m
,例如
MonadTrans t=>tma