是否有带有签名:: (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/

10-13 07:08
查看更多