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)
从上下文来看,这实际上是明确的。
让我们玩一下类型检查器,
-- 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。