具有多种 monad 类型的 Haskell do 子句

2023-12-24

我正在 Haskell 中使用一个名为的图形库三便士-GUI http://hackage.haskell.org/package/threepenny-gui。在这个库中,主函数返回一个UI http://hackage.haskell.org/package/threepenny-gui-0.6.0.3/docs/Graphics-UI-Threepenny-Core.html#t:UI单子对象。当我试图打开包装时,这让我非常头痛IO值到局部变量中我收到错误,抱怨不同的 monad 类型。

这是我的问题的一个例子。这是标准 main 函数的稍微修改版本,如 Threepenny-GUI 的代码示例所示:

main :: IO ()
main = startGUI defaultConfig setup

setup :: Window -> UI ()
setup w = do

labelsAndValues <- shuffle [1..10]

shuffle :: [Int] -> IO [Int]
shuffle [] = return []
shuffle xs = do randomPosition <- getStdRandom (randomR (0, length xs - 1))
                let (left, (a:right)) = splitAt randomPosition xs
                fmap (a:) (shuffle (left ++ right))

请注意第五行:

labelsAndValues <- shuffle [1..10]

返回以下错误:

Couldn't match type ‘IO’ with ‘UI’
Expected type: UI [Int]
  Actual type: IO [Int]
In a stmt of a 'do' block: labelsAndValues <- shuffle [1 .. 10]

至于我的问题,我如何解压IO使用标准箭头符号的函数(<-),并继续将这些变量设置为IO ()而不是UI (),这样我就可以轻松地将它们传递给其他函数。

目前,我发现的唯一解决方案是使用liftIO http://hackage.haskell.org/package/transformers-0.4.3.0/docs/Control-Monad-IO-Class.html#v:liftIO,但这会导致转换为UImonad 类型,而我实际上想继续使用IO type.


A doblock是针对特定类型的monad,你不能只改变中间的类型。

您可以转换操作,也可以将其嵌套在do。大多数时候,转变已经为你准备好了。例如,您可以有一个嵌套的doio然后仅在交互点进行转换。

在你的情况下,liftIOLaterThreePennyUI 包提供了函数来为您处理这个问题。

liftIOLater :: IO () -> UI ()

安排稍后运行的 IO 操作。

为了执行相反的转换,您可以使用runUI:

runUI :: Window -> UI a -> IO a

在特定浏览器窗口中执行 UI 操作。还运行所有计划的 IO 操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多种 monad 类型的 Haskell do 子句 的相关文章

随机推荐

  • 如何使用R的pixmap包提取像素数据?

    如何使用R的pixmap包提取像素数据 所以我使用以下方法读取图像文件 图片 如何将像素数据提取到某个矩阵中 您可以通过以下方式获取灰度图像的 2 D 矩阵数据或彩色图像的 3 D 数组数据 getChannels gt x lt read
  • 使用 querySelector 获取包含某个类的所有元素

    为了改变我正在使用的类中的一些样式querySelector el querySelector fa fa car style display none 这对于一个元素来说效果很好 但如果有更多元素包含此类 并且我想将所有元素的显示更改为无
  • WooCommerce 无法从产品类别访问购物车

    我有一个自定义的 WooCommerce 产品类型 我需要从其中访问购物车 URL 看起来很简单 class WC Product My Product extends WC Product Simple public function s
  • 使用 PIL 更改 OpenCV Python 中的字体系列

    上面的答案没有解决我的问题 我在用cv2 putText 将文本放在视频上 这按预期工作 但我正在尝试使用不同的字体 在 OpenCV 中不可用 据我了解 OpenCV 仅限于cv2 FONT HERSHEY字体 所以我使用 PIL 和 O
  • 在渲染中传递参数 - Rails 3

    我看到了几个关于此的问题 但无法解决 我试图在渲染部分时传递参数 类似于domainname com memory books new fbookupload yes 现在 我使用这一行 在部分中 我尝试使用以下方式获取 fbookuplo
  • 如何使用 axios 重定向后获取登陆页面 URL

    使用 NodeJS 如果我使用 maxRedirects 5 的 axios 如果我输入将重定向到另一个 URL 的 URL 如何从最终登陆页面获取 URL 在 HTTP 标头中 当存在 HTTP 200 代码时 就没有着陆页的标头字段 示
  • Django:在保存之前修改模型的字段

    我有一个模型 course 与ImageField and FileField所以我想在用户每次创建课程时创建一个文件夹 我想我可以在保存模型之前执行此操作 所以这是我的问题 如何在方法中访问模型的字段 模型 py Class Course
  • 在 Objective C 中复制整数数组最有效的方法是什么?

    在 Objective C 中将 1000 个整数的数组从一个数组复制到另一个数组的最有效方法是什么 这将在 iPhone 上运行一些绘图代码 因此尽可能高效很重要 Thanks 如果关心的是效率 我假设这是一个 C 整数数组 如果是这样
  • 如何使用ConfigurationManager解析app.config?

    我正在使用某种方法来解析我的 app config 文件 然后我被告知使用 ConfigurationManager 更好 更简单 但问题是我不知道如何使用 ConfigurationManager 来做到这一点 我原来的代码是这样的 Xm
  • Angular 2 - 所有组件的全局变量

    我的 angular2 应用程序在许多不同的组件中使用我的后端 Laravel API 我一直在想 将来我需要更改 API URL 这意味着我必须在我对 API 使用 http get post 方法的所有地方 在所有组件中 更改我的 AP
  • SSL - 如何以及何时使用它

    我有一个客户需要 SSL 来保护在线捐赠 但我对于如何 何时使用 SSL 的经验有限 据我所知 在购买证书时 我将该证书分配给整个域 实际上是 IP 地址 有没有办法将加密隔离到网站的单个页面 或者我应该继续保护整个网站 即使只有一个页面需
  • 如何正确使用 scikit-learn 的高斯过程进行 2D 输入、1D 输出回归?

    在发帖之前我做了很多搜索并发现这个问题 https stackoverflow com questions 21320964 how to make a 2d gaussian process using gpml matlab for r
  • OpenCV 后台描述文件无效

    当我尝试使用此命令时 opencv createsamples img image jpg bg bg txt info info info lst pngoutput info num 2600它告诉我 无效的背景描述文件 我现在尝试 n
  • Android Webrtc 将流更改为 STREAM_MUSIC

    我已经创建了从一台设备到另一台设备的 WebRTC 会话 该设备应该能够控制音乐流的音量 但 WebRTC 最初设计用于传输 voice call 因此使用 voice call 通道并使用通话音量控制对于非通话应用程序 我尝试在 WebR
  • 设置seaborn图的x轴间隔

    我有一组子图要绘制 这里 我们如何设置第二行子图中x轴的间隔 即ax4 to ax6 目前 从 1 到 100 的所有值都会打印出来 如图所示 我试过ax4 set xticks range 1 100 5 但在那里 显示的范围是 1 到
  • 将控制台应用程序转换为 Windows 服务

    我正在尝试将生成 pdf 报告的控制台应用程序转换为 Windows 服务 我的代码如下 我的方向正确吗 我安装了此服务并且启动 停止工作正常 但没有生成报告 控制台应用程序本身就可以很好地生成 Output pdf 我的目标是在服务启动时
  • Java 11 应用程序作为轻量级 docker 镜像

    受到提问的启发为什么 Java 11 基础 Docker 镜像如此大 openjdk 11 jre slim https stackoverflow com questions 53375613 我发现这个话题在Java世界里还没有定论 A
  • C# 中的 Oracle、绑定变量和 ID IN (1, 2, 3) 等查询

    我正在寻找以下 Java 技术的 C ODAC 改编 其中代码能够将数字数组 数组大小可以变化 绑定到非 PL SQL 中SELECT语句 然后在 a 中使用结果数组WHERE ID IN 风格检查 http rafudb blogspot
  • 我应该从源代码编译一个库吗?

    我正在开发一个将在定制的 基于 debian 的 Linux 系统上运行的应用程序 我们有一个工具链 以便我们可以为目标系统交叉编译应用程序 这样我们就不必依赖于我们进行编译的主机操作系统 而不是目标操作系统 但是 我不确定我们是否应该从源
  • 具有多种 monad 类型的 Haskell do 子句

    我正在 Haskell 中使用一个名为的图形库三便士 GUI http hackage haskell org package threepenny gui 在这个库中 主函数返回一个UI http hackage haskell org