是否有带有签名:: (Monad m) => m a -> a
的内置函数?
Hoogle告知没有此功能。
你能解释为什么吗?
最佳答案
一个monad仅提供两个功能:
return :: Monad m => a -> m a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
两者都返回
m a
类型的东西,因此无法以任何方式组合它们来获得Monad m => m a -> a
类型的功能。为此,您不仅需要这两个功能,还需要更多关于m
的知识,而不是单子(monad)代码。例如,
Identity
monad具有runIdentity :: Identity a -> a
,并且几个monad具有相似的功能,但是无法通用地提供它。实际上,对于像IO
这样的单子(monad)来说,无法从单子(monad)中“逃脱”是至关重要的。关于haskell - 如何从单调行动中获取值(value),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8567743/