代码之家  ›  专栏  ›  技术社区  ›  Mystor

动态类型语言中的IO Monad

  •  5
  • Mystor  · 技术社区  · 12 年前

    在Haskell中,我觉得非常漂亮的一点是它将Monads作为有效行为的抽象。它创建了一种非常优雅的方式来表达命令式代码,同时也允许在保证正确性的情况下发生强大的事情。

    IO monad似乎并不特定于强类型语言。具体来说,在我看来,用动态类型语言实现IO monad并不困难,也不具有革命性。然后只需要限制语言,使所有IO操作都只在IO monad中生成操作。

    尽管如此,我还没有看到任何语言(也许我只是不够努力)是动态类型的,但使用monad可以隔离副作用。这种情况有什么原因吗?(或者它们存在吗?)

    1 回复  |  直到 7 年前
        1
  •  12
  •   Carl    12 年前

    你在这里混淆了两个问题。我不能因此责备你,因为关于Haskell的许多文献也将这两种观点混为一谈。但类型化IO是Haskell方法的魔力所在。IO类型形成monad的事实并不是那么重要。这意味着它可以与其他类型共享库函数,而不是自己重新实现它们。

    monad抽象在动态类型语言中并不能很好地工作。当然,他们可以给你类似的 fmap 和 (>>=) 但没有好办法 return 以动态类型语言工作。它在一个仅在其返回类型中出现的类型变量中是多态的。我不知道有哪种语言具有能够理智地处理这种情况的动态类型。我想可能有一些方法来破解它,比如使用一个自由的monad结构和大量的内省,但我怀疑它是否会像一个有用的抽象。

    但另一部分,类型化IO,可能会集成到动态语言中。显然,它将成为运行时标记的IO,而不是类型化的IO。但是,必须构建语言的所有内容来支持它。程序执行的入口点必须指定为IO值,而不是像大多数动态语言选择的那样,只执行文件中的每一行。然后,您必须使用组合符或语法来组合IO值,如Haskell中所示。最后,你必须忍受用户声称这种语言太难使用,因为它与他们习惯的语言不一样。

    真的,这是最后一个杀手。

    推荐文章