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)
然后你可以看到类型匹配.
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |