是否可以在Clojure中从Haskell执行IO monad?

时间:2014-02-17 10:35:05

标签: haskell clojure monads io-monad

我查看了algo.monadsfluokitten文档。我还通过Jim DueyKonrad HinsenLeonardo Borges阅读了monad博客条目。

我能找到的最接近的是Konrad Hinsen's library Monadic IO streams - 但这似乎并没有“实现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中执行IO Monad from Haskell您能提供一个示例吗?

1 个答案:

答案 0 :(得分:15)

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

  • <强>中平凡: 将IO视为monad变换器,授予使用副作用的特殊许可。然后Clojure中的任何monad都是IO monad,因为执行副作用并不是Clojure中的特权操作。

  • 肥胖: Clojure是Turing-complete,因此您可以实现所有Haskell,包括Clojure中的IO monad。 Haskell是图灵完备的,因此您可以在Haskell中实现所有Clojure并公开IO monad。

没有

  • 哲学上: IO monad的本质,在与类型系统集成时保持纯度,与Clojure的杂质和动态类型不相容。任何试图在IO monad中偷窃的企图要么与Clojure的理念不一致,要么没有抓住IO monad的基本要点。

也许

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

  • 有一天:Typed Clojure感兴趣。如果副作用被添加到类型系统中,那么为了某些目的可能需要以结构化的方式隔离它们,并为在Typed Clojure中存在类似IO monad的东西提供理由。