Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能在Clojure的Haskell做IO单子吗?_Haskell_Clojure_Monads_Io Monad - Fatal编程技术网

有可能在Clojure的Haskell做IO单子吗?

有可能在Clojure的Haskell做IO单子吗?,haskell,clojure,monads,io-monad,Haskell,Clojure,Monads,Io Monad,我已经看过了文档和文档。我也读过monad的博客,作者是,和 我能找到的最接近的是——但这似乎并没有“实现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 ::

我已经看过了文档和文档。我也读过monad的博客,作者是,和

我能找到的最接近的是——但这似乎并没有“实现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
oneST::ST s Int——请注意,这对任何

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

  • 琐碎的: 可以将IO看作是一个单子转换器,它授予处理副作用的特殊权限。那么Clojure中的任何单子都是IO单子,因为在Clojure中执行副作用不是特权操作

  • 令人费解:Clojure是图灵完成的,因此您可以实现所有Haskell,包括Clojure中的IO monad。Haskell是图灵完备的,因此您可以在Haskell中实现所有Clojure并公开IO monad

  • 哲学上:IO单子的本质是在与类型系统集成的同时保持纯度,与Clojure的杂质和动态类型不兼容。任何试图将木偶单子钉在木偶单子上的尝试,要么与Clojure的哲学相悖,要么无法抓住木偶单子的本质
大概
  • 部分:问题中链接的单子io流库旨在与algo.monads库或其前身一起使用。单子接口是状态单子。一元io流提供了一些被囚禁的io一元函数来使用它。这并不妨碍您使用任何具有副作用的其他函数,并且如果没有集成IO的类型系统,就没有系统化的方法来确定哪个是哪个。这不是IO单子;它只是做了一些类似于IO单子的事情。这是有趣的,但其效用值得怀疑

  • 有一天:有人对它感兴趣。如果在类型系统中添加了副作用,那么出于某些目的,可能需要以结构化的方式将其隔离,并给出在类型Clojure中存在类似IO monad的原因


Clojure不是一种动态类型语言吗?那么像IO或ST这样的单子有什么好处呢?对非法操作抛出例外?总的来说,这可能比以后在程序流中处理非法操作的影响要好。您希望在Clojure中重用Haskell
IO
的哪些特定功能?这是可能的,但由于Clojure中缺少可靠的尾部调用,我怀疑它是否非常实用。@lpsmith,你能详细解释一下“可靠的尾部呼叫”是什么意思吗?我不是Monad专家,但我不明白你为什么说它可以部分完成。IO Monad中的哪些依赖于静态类型?在我看来什么都没有。您不必通过IO Monad专门执行IO,这并不意味着您无法实现IO Monad。就连哈斯克尔也有不安全的表现。因此,为什么不愚蠢地将其改为“是”(或者说你可以,但在Clojure中这样做并不是超级棒,而且你很容易意外地破坏了它的好处)。