" monad-based IO" Haskell的设计与基于标记纯/不纯代码的设计形成鲜明对比?

时间:2015-09-14 16:47:42

标签: haskell

众所周知,IO Monad将Haskell中的纯粹代码与不纯净代码分开,因此像f :: ... -> IO ?这样的签名表示具有副作用的动作,否则它是纯函数。

此外,monads在Haskell中用作序列操作的纯函数机制,否则可能会被设计为仅处理纯函数的编译器意外重新排序。

围绕monad设计的问题在于它们似乎很难理解,可能包括我自己,所以我想知道它们是否是在软件开发中将纯粹代码与不纯代码分开的最佳方式。

我认为如果我们的语言中所有基元都被标记为纯粹和不纯,那么编译器可以直接或间接地使用基元来推断任何函数的纯度,这将是一个更简单的设计。然后,这样的编译器会知道代码的哪些部分可以重新排序,因为它们是纯粹的,或者由于存在副作用,某些顺序是必要的。

所以,我的问题是:

基于monad的IO"有哪些优点/缺点?设计与基于标记语言中的纯/不纯原语的设计相比,我在上面描述过吗?

1 个答案:

答案 0 :(得分:4)

Haskell使用IO类型执行类似的操作。然而,Haskell类型系统更为通用。您可以将monad视为潜在副作用范围的声明,因此您可以使用更复杂的系统,而不是使用二进制纯/不纯标记。

当然,Haskell monads关于“杂质”的一个神话。 IO当然是一个特例,但所有其他monad都是用Haskell编写的,具有完全纯粹的“bind”实现。 (好吧,ST和STM可能需要运行时系统的一些魔力来提高效率,但它们可以在Haskell中编写)。