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

2023-12-23

我已经看过了算法单子 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(使用前将#替换为@)

是否可以在 Clojure 中从 Haskell 执行 IO monad? 的相关文章

  • 为什么这个 Clojure 减速器 r/fold 没有提供任何性能优势?

    我想知道为什么下面的代码在 r fold 的情况下没有提供加速 我对减速器有什么误解吗 我在一个相当慢的 尽管有 2 个核心 Ubuntu 12 04 开发盒上运行它 通过 emacs 和 lein 运行 每个都有相同的结果 require
  • 为什么 clojure future 会阻塞主线程?

    我有一个简单的 lein 项目 其中 main包含一个未来 def f future 42 defn main args println f 当我跑步时lein run它打印42但不返回 我不明白为什么它不返回 如何得到lein run回来
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 如何应用Clojure? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习 Clojure 我真的很喜欢它的一些功能 是时候考虑一 些真正的 宠物项目 了 我意识到我不知道如何真正做到这一点use克
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 适用于具有不同数量数据字段的用户的功能

    这个问题是我练习的时候产生的教程中的观察者主题 http mishadoff com blog clojure design patterns episode 10 observer我试图将该功能应用于用户 但无法使用用户的数据字段 例如姓
  • Clojure 中 with-local-vars 和 with-bounds 之间的区别

    Clojure 的文档with local vars http clojuredocs org clojure core clojure core with local vars and with bindings http clojure
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • Emacs/Swank/Paredit for Clojure 的温和教程

    我要转向 Emacs 来工作Clojure http en wikipedia org wiki Clojure Lisp 为了能够执行以下操作 我需要在 Emacs 上设置哪些信息 自动匹配 生成相应的右括号 自动缩进 Lisp Cloj
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • Scala - Java = ? (或者 Clojure - Java = ?)

    开发人员可以在不懂 Java 的情况下使用 Scala 吗 开发人员可以在不懂 Java 的情况下使用 Clojure 吗 注意 例如 我是一名 C 开发人员 我在不了解任何 VB 的情况下使用 NET 当然 WF 4 0 使用 VB 进行

随机推荐