我已经看过了算法单子 https://github.com/clojure/algo.monads/wiki and 荧光小猫 http://fluokitten.uncomplicate.org/articles/functors_applicatives_monads_in_pictures.html文档。我还阅读了 monad 博客文章Jim Duey http://www.intensivesystems.net/tutorials/monads_101.html, 康拉德·辛森 http://onclojure.com/2009/03/05/a-monad-tutorial-for-clojure-programmers-part-1/ and 莱昂纳多·博尔赫斯 http://www.leonardoborges.com/writings/2012/11/30/monads-in-small-bites-part-i-functors/.
我能找到的最接近的是Konrad Hinsen 的 Monadic IO 流库 http://richhickey.github.io/clojure-contrib/monadic-io-streams-api.html- 但这似乎并没有“实现 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
我的问题是:是否可以这样做Haskell 的 IO Monad http://www.haskell.org/haskellwiki/IO_inside在 Clojure 中?你能举个例子吗?
有几种方法可以回答这个问题。
Yes
简单地说:将 IO 视为一个 monad 转换器,它授予处理副作用的特殊许可。那么 Clojure 中的任何 monad 都是 IO monad,因为执行副作用在 Clojure 中不是特权操作。
愚蠢地:Clojure 是图灵完备的,因此您可以实现 Haskell 的所有内容,包括 Clojure 中的 IO monad。 Haskell 是图灵完备的,因此您可以在 Haskell 中实现所有 Clojure 并公开 IO monad。
No
-
从哲学上来说:IO monad 的本质是在与类型系统集成的同时保持纯度,这与 Clojure 的杂质和动态类型不兼容。任何硬塞进 IO monad 的尝试要么与 Clojure 的哲学相矛盾,要么无法抓住 IO monad 的本质。
Maybe
部分:问题中链接的 monadic-io-streams 库旨在与 algo.monads 库或其前身一起使用。 Monadic 接口是状态 Monad。 Monadic-io-streams 提供了一些被监禁的 IO Monadic 函数来使用它。这并不妨碍您使用任何其他有副作用的函数,并且如果没有集成 IO 的类型系统,就没有系统的方法来区分哪个是哪个。这不是 IO monad;而是 IO monad。它只是做了一些类似于 IO monad 的事情。这很有趣,但实用性值得怀疑。
Someday:有兴趣类型化 Clojure https://github.com/clojure/core.typed。如果将副作用添加到类型系统中,那么出于某些目的,可能需要以结构化方式隔离它们,并给出 Typed Clojure 中 IO monad 之类的存在的理由。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)