Haskell如何在MaybeT实现中推断出正确的类型类?

sev*_*evo 5 monads haskell types type-inference monad-transformers

Haskell如何知道每个return表达式的哪个是正确的monad实例?

newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }

instance Monad m => Monad (MaybeT m) where
    return  = MaybeT . return . return
Run Code Online (Sandbox Code Playgroud)

Dan*_*zer 4

从上下文来看,这实际上是明确的。

让我们玩一下类型检查器,

-- From the signature
MaybeT . return . return :: a -> MaybeT a 
-- From the type of MaybeT
return . return :: a -> m (Maybe a)
-- From the type of `.`
(return :: Maybe a -> m a) . (return :: a -> Maybe a)
Run Code Online (Sandbox Code Playgroud)

一旦我们有了每个 的类型return,“实例选择算法”将正确选择第一个使用msreturn和第二个使用 s Maybe