我查看了algo.monads和fluokitten文档。我还通过Jim Duey,Konrad Hinsen和Leonardo 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?您能提供一个示例吗?
答案 0 :(得分:15)
有几种方法可以回答这个问题。
<强>中平凡:强> 将IO视为monad变换器,授予使用副作用的特殊许可。然后Clojure中的任何monad都是IO monad,因为执行副作用并不是Clojure中的特权操作。
肥胖: Clojure是Turing-complete,因此您可以实现所有Haskell,包括Clojure中的IO monad。 Haskell是图灵完备的,因此您可以在Haskell中实现所有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的东西提供理由。