部分应用程序的说明 - 加入

Dav*_*ric 5 haskell types partial-application

为什么部分应用具有不同签名的函数有效?

Control.Monad.join为例:

GHCi> :t (=<<)
(=<<) :: Monad m => (a -> m b) -> m a -> m b
GHCi> :t id
id :: a -> a
GHCi> :t (=<<) id
(=<<) id :: Monad m => m (m b) -> m b
Run Code Online (Sandbox Code Playgroud)

为什么它id :: a -> a代替(a -> m b)争论而接受,因为它们明显不同?

Mat*_*ick 10

=<<类型签名说第一个参数是从a(任何)到monad的函数b.

好吧,m b算什么,对吗?所以我们可以代替m b每一个a:

(=<<) :: Monad m => (m b -> m b) -> m (m b) -> m b
Run Code Online (Sandbox Code Playgroud)

ids类型说它是从任何东西到同一个东西的函数.因此,如果我们分入m b(不要忘记monad约束),我们得到:

id :: Monad m => m b -> m b
Run Code Online (Sandbox Code Playgroud)

然后你可以看到类型匹配.