一个常见的初学者的错误是看到 return
并认为它是一个语言关键字,以返回值退出当前函数。当然,我们知道它根本不是这样做的。但我想知道......我们真的可以制作这样的功能吗?在这一点上,纯粹是为了争论。
似乎我们正在寻找一些具有函数的 monad Foo
exit :: x -> Foo x
这将中止其余的计算并立即返回
x
。这样的东西可以 build 吗?如果可以 build ,它会有用吗?这甚至是一种理智的尝试吗?
最佳答案
是的,在 Cont
monad 中是可能的。 Cont
定义如下:
newtype Cont r a = Cont {runCont :: (a -> r) -> r}
instance Monad (Cont r) where
return a = Cont ($ a)
m >>= k = Cont $ \c -> runCont m $ \a -> runCont (k a) c
现在我们可以创建
exit
如下:exit = Cont . const
实际上,您几乎可以在任何 monad 中执行此操作(例如,您可以在
Either
monad 中执行此操作,但不能在 State
monad 中执行此操作)。然而 Cont
monad 是所有 monad 之母:http://blog.sigfpe.com/2008/12/mother-of-all-monads.html关于haskell - 带有 "real"返回函数的 monad,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21066288/