10

我查看了algo.monadsfluokitten文档。我还阅读了Jim DueyKonrad HinsenLeonardo Borges的 monad 博客文章。

我能找到的最接近的是Konrad Hinsen 的库 Monadic IO 流- 但这似乎不是“实现 monad 接口”(因为需要更好的措辞)

这是在 Haskell 中使用 ST 的示例

oneST :: ST s Int -- note that this works correctly for any s
oneST = do var <- newSTRef 0
           modifySTRef var (+1)
           readSTRef var

one :: Int
one = runST oneST

我的问题是:是否可以在 Clojure 中从 Haskell 执行 IO Monad ?你能举个例子吗?

4

1 回答 1

16

有几种方法可以回答这个问题。

是的

  • 简单地说: 将 IO 视为一个 monad 转换器,它授予使用副作用的特殊权限。那么 Clojure 中的任何 monad 都是 IO monad,因为执行副作用不是 Clojure 中的特权操作。

  • 愚蠢地: Clojure 是图灵完备的,所以你可以实现所有的 Haskell,包括 Clojure 中的 IO monad。Haskell 是图灵完备的,因此您可以在 Haskell 中实现所有 Clojure 并公开 IO monad。

  • 哲学上: IO monad 的本质,在与类型系统集成的同时保持纯度,与 Clojure 的不纯度和动态类型不兼容。任何在 IO monad 中硬塞的尝试要么与 Clojure 的哲学相矛盾,要么无法抓住拥有 IO monad 的要点。

也许

  • 部分:问题中链接到的 monadic-io-streams 库旨在与 algo.monads 库或其前身一起使用。monadic 接口是 state monad。Monadic-io-streams 提供了一些被监禁的 IO monadic 函数来使用它。这并不妨碍您使用任何其他具有副作用的功能,并且如果没有集成 IO 的类型系统,就没有系统的方式来说明哪个是哪个。这不是 IO 单子;它只是做了一些类似于 IO monad 的事情。这很有趣,但效用可疑。

  • 某天:人们对Typed Clojure感兴趣。如果将副作用添加到类型系统中,那么出于某些目的以结构化方式将它们隔离出来并为 Typed Clojure 中存在诸如 IO monad 之类的东西提供理由可能会变得可取。

于 2014-02-19T03:10:06.193 回答