一个常见的初学者的错误是看到 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/

10-12 03:49