Haskell:Yesod 和状态

2024-03-09

我正在阅读代码玩具 URL 缩短器 http://flygdynamikern.blogspot.com.au/2011/06/toy-url-shortener-with-yesod-and-acid.html。然而,有一些重要的部分我就是无法理解。

它有以下代码:

data URLShort = URLShort { state :: AcidState URLStore }

出于测试目的,我在自己的应用程序中编写了类似的内容:

data MyApp = MyApp { state :: Int }

然后我可以通过改变来编译

main = warpDebug 3000 MyApp

to

main = warpDebug 3000 (MyApp 42)

然后我可以通过执行以下操作来读取处理程序中的状态

mystate <- fmap state getYesod 

受到启发acid <- fmap state getYesod在文章中。但是,我不知道如何写。

我也尝试过这样做:

data MyApp = MyApp { state :: State Int Int }

但我并没有对此走得太远。

我试图弄清楚如何AcidState只需做一些简单的类似示例即可工作,因为AcidState将所有内容都保留在内存中,我应该也能做同样的事情吗?

对这里发生的事情的任何一般性解释,以及也许我如何忽略了这一点,都将非常感激。


The AcidState a数据类型并不是一个始终不变的值;它包含对内部可变数据的引用。在这种情况下,Yesod-land 中存储的只是对此数据的不可变引用。当您更新状态时,您实际上并没有更新基础数据类型中的值,而是更新了它指向的内存。

Haskell 世界中的每个值都是不可变的。然而,Haskell 领域之外的许多事物并不是一成不变的。例如,当你这样做时putStrLn,终端改变其显示以显示新内容。这putStrLn行动本身是一个不可变的纯粹价值,但它描述如何执行涉及突变的操作。

还有其他函数也可以产生执行突变的操作;如果你这样做ref <- newIORef 0,您将获得一个描述创建可变内存单元的操作的值。如果你那么做modifyIORef ref (+1),您将获得一个描述操作的值,该操作将该单元格中的值增加1. The ref值是一个纯价值,它只是对可变单元格的引用。代码也是纯功能性的,因为每个片段只描述一个动作;没有什么是可变的在 Haskell 程序中.

就是这样AcidState实现它的状态:通过使用一个在 Haskell 世界之外管理状态的系统。这并不像 C 语言那样具有完全可变性“那么糟糕”,因为在 Haskell 中,你可以控制可变性凭借单子的力量。使用AcidState是完全安全的并且不涉及使用unsafePerformIO据我所知。

With AcidState在这种情况下,您使用openAcidState emptyStore in the IOmonad 创建一个新的酸性状态(该行是描述打开新酸性状态的 IO 操作的值)。你用createCheckpointAndClose可选择将酸状态安全地保存到磁盘。最后,您使用update'具有突变酸态内容物的功能。

自己创建一个“小状态”IORef是(可变状态的最简单形式,除了STmonad),首先将这样的字段添加到您的基础数据类型中:

data VisitorCounter = VisitorCounter { visitorCounter :: IORef Int }

然后你做:

main = do
  counter <- newIORef 0
  warpDebug 3000 (VisitorCounter counter)

在处理程序中,您可以像这样修改计数器:

counter <- fmap visitorCounter getYesod
modifyIORef counter (+1)
count <- readIORef counter
-- ... display the count or something

注意对称性AcidState.

对于站点计数器,我实际上建议使用TVars http://hackage.haskell.org/packages/archive/stm/latest/doc/html/Control-Concurrent-STM-TVar.html#TVar代替IORefs,因为多个客户端可能同时修改变量。接口为TVar然而,s 非常相似。


跟进问题作者的问题?

我已经放置了{ visitorCounter :: TVar Int }在我的基础类型中,以及处理程序中的以下代码:

counter <- fmap visitorCounter getYesod
count <- readTVar counter

第一行编译正常,但第二行抛出此错误:

Couldn't match expected type `GHandler sub0 Middleware t0'
            with actual type `STM a0'
In the return type of a call of `readTVar'
In a stmt of a 'do' expression: count <- readTVar counter

我该如何解决这个问题?

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

Haskell:Yesod 和状态 的相关文章

  • macOS 上的堆栈构建

    我是新来的haskell 我有最简单的程序 usr bin env stack stack resolver lts 13 7 script module Main where import Lib main IO main putStrL
  • Haskell 长度函数实现

    我正在学习 Haskell 编程 我试图理解列表是如何工作的 因此我尝试编写两个可能的length功能 myLength a gt Integer myLength foldr x gt 1 0 myLength1 a gt Integer
  • 在 Haskell 中编写 Web 应用程序的最简单方法是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的项目中更多地使用 Haskell 并且我认为如果我可以开始将它用于 Web 应用程序 这将真正
  • 使用 Template Haskell 生成函数

    是否可以使用 Template Haskell 定义函数 例如 convertStringToValue String gt Int convertStringToValue three 3 convertStringToValue fou
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • 使用 SwiftUI 的新 iOS 14 生命周期访问 AppDelegate 中的 AppState

    我正在使用 iOS 14 中推出的 SwiftUI 新应用程序生命周期 但是 我不知道如何访问我的AppState 单一事实来源 对象应用程序代理 我需要应用程序代理在启动时运行代码并注册通知 didFinishLaunchingWithO
  • 如何在 Windows 7 中配置 cabal?

    我已经在Windows 7中安装了Haskell Platform 2012 我在控制台中编写cabal update我收到消息说有新版本的阴谋集团 我写的cabal install cabal install 安装完成后 它告诉我 cab
  • 提交后清除 React 中的表单

    我试图在使用 Axios 创建表单提交后清除表单数据 消息处理良好 响应记录到页面 但每个文本字段中的数据在提交后仍保留在页面上 我尝试添加一个resetForm函数 我将表单设置回原来的空白状态 但这不起作用 import React C
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • 是否可以列出派生 Generic 的记录数据类型中字段的名称和类型?

    我知道对于派生 Data Data 的数据类型 constrFields http hackage haskell org package base 4 7 0 2 docs Data Data html v constrFields给出字
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • StateObject 作为 init() 中另一个对象的参数

    我试图将 StateObject 用户传递给authenticationHelper 但我不能 因为 IDE 说 在初始化所有存储的属性之前使用 self 即使它是在结构体的开头初始化的 我考虑过将 user 的初始化移至 init 但同样
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • 如何使用RecyclerView.State保存RecyclerView滚动位置?

    我有一个关于 Android 的问题RecyclerView State http developer android com reference android support v7 widget RecyclerView State h
  • React Native 将样式设置为 State

    我想用backgroundColor of style1作为一种状态 并在函数中改变它change 我怎样才能访问style1 我的观点是调用该函数change从另一个函数 使按钮将其颜色更改为黄色 然后在一段时间后再次将其颜色更改为蓝色
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera

随机推荐

  • 处理表中的溢出

    如果我有一个像这样非常非常简单的例子的表 table table layout fixed width 300px td1 width 100px td2 width 200px 在我的其中之一 td2包含一个图像 可以说 300px in
  • C++ 删除静态数据

    如果我有一个类 其中包含分配在堆上且永不更改的私有静态数据 那么我应该什么时候 如果有的话 删除它 据我了解 类本身永远不会被构造 因为类不是 C 中的第一类对象 那么没有析构函数来删除其中的静态数据 我是 C 新手 如果我对 C 的理解有
  • 如何使用logstash插件-logstash-input-http

    我正在探索 Logstash 以接收 HTTP 上的输入 我已经使用以下方式安装了 http 插件 插件安装logstash input http 安装成功 然后我尝试使用以下命令运行logstash Logstash e 输入 http
  • R:Tibble 与 ggplot2(绘制图表)

    我正在尝试遵循 R 中的教程 https rviews rstudio com 2017 09 25 survival analysis with r https rviews rstudio com 2017 09 25 survival
  • 当用户调整 QMainWindow 大小时如何分配回调?

    我既无法在 QMainWindow 上找到类似教程的调整大小事件方案 也没有在 Qt 设计窗口的下拉菜单中看到任何用于添加调整大小事件的选项 我是 Qt 新手 我想为 QMainWindow 调整大小事件编写一个槽函数 有这样的活动吗 我怎
  • 在 Excel 中设置 csv 文件格式

    Win XP Excel 2007 我知道还有很多关于 csv 格式的其他帖子 但无法找到我需要的内容 我们的一些数据被另一家公司保存在异地 他们每天早上都会向我们发送包含前几天数据的 csv 文件 问题是这些数据来自可能具有下拉列表的网络
  • 使用sync_imports()在IPython.parallel引擎上导入自定义模块

    我一直在玩 IPython parallel 我想使用我自己的一些自定义模块 但无法按照上的说明进行操作烹饪书 http ipython org ipython doc stable parallel parallel multiengin
  • Nifty Modal - 如何在没有按钮的情况下触发模式

    这个脚本 http stuff wp dreams com modal 提供了很棒的模式转换 我想使用它们而不是标准的警报消息 现在脚本的演示展示了如何通过按 a 来触发它们
  • 如何从 R 读取换行符分隔的 JSON 文件?

    我有一个换行符分隔 即每个 JSON 对象仅限于文件中的 1 行 name json1 name json2 name json3 在Python中 我可以轻松地阅读它 如下所示 我必须使用编码encoding cp850 读取我的真实数据
  • IllegalStateException:数据库已关闭(使用 ViewPager)

    我对导致此错误的原因感到困惑 因为我已确保正确关闭数据库适配器 至少我认为是 以下是 LogCat 的说法 所有这些标签的标签都是 AndroidRuntime 致命异常 主要 java lang IllegalStateException
  • 从 ASP.NET Core Web API 将多 GB 文件流式传输到 AWS S3

    我希望通过 ASP NET Core Web API 在 AWS S3 存储桶中创建一个大型 多 GB 文件 该文件足够大 我不想加载Stream在将其上传到 AWS S3 之前先将其存储到内存中 Using PutObjectAsync
  • 如何拆分结果中尾随空字符串的字符串?

    我对 Scala 字符串分割行为有点困惑 因为它不能一致地工作 并且缺少一些列表元素 例如 如果我有一个包含 4 列和 1 个缺失元素的 CSV 字符串 elem1 elem2 elem 4 split List elem1 elem2 e
  • [Cucumber][JVM][Maven]测试无法通过 maven 从命令行运行

    我正在使用 java cucumber 和 Maven 运行测试 我正在使用 Eclipse IDE pom xml 也具有 Cucumber 依赖项 我以两种方式运行测试 从 Eclipse IDE 我将测试作为 Junit 测试运行 测
  • 如何防止未经授权的蜘蛛抓取

    我想防止从我们的网站之一自动抓取 html 同时不影响合法的蜘蛛抓取 googlebot 等 是否已经存在可以实现此目的的东西 我是否使用了正确的术语 编辑 我主要是为了防止人们恶意这样做 IE 他们不会遵守 robots txt EDIT
  • 并行下载大量文件的有效方法

    我正在尝试从互联网下载大量文件 图片 我正在努力处理异步 并行 因为 a 我不能说是否有文件 我刚刚收到一百万个链接 其中要么是一张图片 300kb 到 3MB 要么是 404 页面不存在 因此 为了避免下载 0 字节文件 我询问同一页面两
  • 没有默认构造函数的类对象的值初始化

    我试图通过以下方式了解值初始化的确切行为T or T 对于类类型T在 C 11 中 让我困惑的是这两个片段取自http en cppreference com http en cppreference com 值初始化 http en cp
  • Swift 逆向工程:Swift 函数名称规则?

    我有一个关于 swift 函数名称规则的问题 当我尝试在 IDA Pro 中分析用 swift 编写的 iOS 应用程序 也许 OS X 也是同样的情况 例如 swift 2048 时 我得到了这样的函数名称 EXPORT TFC10swi
  • Openssl 1.1.0 中的 c2i_ASN1_INTEGER 函数

    我最近在linux系统中将openssl从1 0 2n更新到1 1 0g 早些时候我正在使用 ASN1 INTEGER c2i ASN1 INTEGER ASN1 INTEGER a const unsigned char pp long
  • DataFrame 对象没有属性“名称”

    我目前有一个 Pandas DataFrame 列表 我试图对每个列表元素 即列表中包含的每个 DataFrame 执行操作 然后将该 DataFrame 保存到 CSV 文件 我分配了一个name属性到每个 DataFrame 但我意识到
  • Haskell:Yesod 和状态

    我正在阅读代码玩具 URL 缩短器 http flygdynamikern blogspot com au 2011 06 toy url shortener with yesod and acid html 然而 有一些重要的部分我就是无