Haskell:在更新函数中引用先前更新的列表元素

2024-02-21

假设我有以下定义

data Book = Book {id :: Int, title :: String}
type Shelf = [Book]

假设我有一个假设的功能(upd用于更新)

updShelf :: Shelf -> Shelf
updShelf all@(book : books) = updBook book : updShelf books

到目前为止一切都很好。现在假设 updateBook 函数需要引用updated预订它之前的三本书,即书架中位置 5 的书的 updateBook 需要引用位置 2 的书(假设前三本书不需要这样的引用来更新)。没问题,我说,然后修改我的代码:

updShelf :: Shelf -> Shelf
updShelf all@(book : books) prevBook = updBook book prevBook : updShelf books
                where prevBook = ???

我需要帮助的是 prevBook 功能。尽管我什至不确定我是否以正确的方式解决这个问题。因此,如果你们有更好的建议以不同的方式解决这个问题,我们将不胜感激

EDIT:

托马斯·M·杜布森:你的solution https://stackoverflow.com/a/12145053/1003417对我不起作用。原因如下: 假设初始货架(全部)状态为

Book {id=1, title="a"}
Book {id=2, title="b"}
Book {id=3, title="c"}
Book {id=4, title="d"}
Book {id=5, title="e"}
Book {id=6, title="f"}
Book {id=7, title="g"}
Book {id=8, title="h"}

那么(drop 3partialUpdate)是(仅使用id而不是整个书本声明):

updBook 4
updBook 5
updBook 6
updBook 7
updBook 8

zipWith' ($) (drop 3partialUpdate) (all) 是:

updBook 4 1
updBook 5 2
updBook 6 3
updBook 7 4 -> YIKES! Older version of book 4!
updBook 8 5 -> YIKES! Older version of book 5!

就我而言,我需要根据第 4 本书和第 5 本书的已更新版本(而不是未更新的版本)更新第 7 本书和第 8 本书。我希望你明白我想传达的意思。


这个技巧与绑结 http://www.haskell.org/haskellwiki/Tying_the_Knot:我们将在计算答案时使用答案。为了便于说明,我将使用type Book = Int反而。

updateShelf :: Shelf -> Shelf
updateShelf shelf = answer where
   answer  = zipWith updateBook shifted shelf
   shifted = replicate 3 Nothing ++ map Just answer

-- some stupid implementation just for illustration
updateBook :: Maybe Book -> Book -> Book
updateBook Nothing          current = current + 1
updateBook (Just threeBack) current = current + threeBack + 1

Now, in ghci,我们可以验证updateShelf确实在使用更新版本:

*Main> updateShelf [1,10,100,1000,10000]
[2,11,101,1003,10012]

如您所见,前三个是1+1, 10+1, and 100+1,其余两个是1000+(1+1)+1 and 10000+(10+1)+1,因此正如您所希望的那样,正在使用更新的先前值。

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

Haskell:在更新函数中引用先前更新的列表元素 的相关文章

  • 在 Haskell 中对单位的组成(例如英寸、美元等)进行建模

    跟进自我之前的一个问题 https stackoverflow com q 73375273 222529 我问如何创建一个可以对单元进行建模的类型 例如Inch 作为 Haskell 中的一种类型 我现在面临的问题是如何对该单元和其他单元
  • 如何在 blaze-html 中渲染 blaze-svg 标记

    我想将使用 blaze svg 生成的 svg 图直接包含在使用 blaze html 生成的 html 中 两者都基于 blaze markup 所以我希望它很容易 diagram1 Svg diagram1 try1 Html try1
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • IOS 为复杂应用程序保存状态

    我正在 iPad IOS 4 2 上构建一个相当复杂的业务应用程序 4 个选项卡 每个选项卡上都有潜在的深层导航路径 在一些更有经验的 iOS 开发人员看来 用户对于在启动之间保存应用程序状态 即应用程序完全终止并随后重新启动之后 的总体期
  • 有什么方法可以在 do / while / let 块中打印出变量的类型吗?

    有没有办法打印出嵌套变量的推断类型ghci 考虑代码 let f g where g x Int x 那么 最好查询一下类型g e g t f g会打印出Int gt Int 您可以通过给出适当的错误类型注释并检查错误消息来诱骗此信息 Ma
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • Haskell:GHC 无法推断类型。由类型签名错误绑定的刚性类型变量

    我看过几篇主题相似的帖子 但它们并不能真正帮助我解决我的问题 所以我才敢重复 现在我有一个带有签名的函数 run Expr query gt RethinkDBHandle gt query gt IO JSON 这是一个数据库查询运行函数
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • 为什么我不能将 Int 类型与 a 类型匹配

    哈斯克尔新手在这里 我在这里尝试做的事情的一个过于简单的例子 test Int gt a test i i Couldn t match expected type a with actual type Int a is a rigid t
  • Haskell:从后面访问列表

    今天我开始学习Haskell 我对函数式语言有点陌生 而且我非常喜欢 Haskell 然而 我有一个关于它的设计的问题困扰着我 从我到目前为止的理解来看 访问列表后面的元素似乎比访问前面的元素要复杂得多 类似于xs x where xs a

随机推荐

  • 插件的 VueJS 反应式绑定 - 如何?

    我正在为 Pouch CouchDB 开发一个 Vue 插件 该插件将是开源的 但只要我能找出我遇到的问题 目前 我正在尝试使该插件非常类似于 Vuex 它具有内部状态 并检测更改 并在发生更改时渲染视图 在 Vue 实例中 我正在初始化一
  • URI 中复杂类型的 WebAPI 帮助页面

    我在用着WebAPI 帮助页面 http blogs msdn com b yaohuang1 archive 2012 08 15 introducing the asp net web api help page preview asp
  • 如何将对象转换为字符串以便与 ActiveRecord 查询一起使用?

    我有一个User 其中有一个String email属性 但是 当我在应用程序中处理电子邮件时 我发现最好先将其转换为 非持久 Email对象 就像这样 class User lt ActiveRecord Base def email E
  • Cron:每 1 秒运行一次 cron?

    如何让 cron 每 1 秒运行一次 默认只有分钟选项 让 cron 第一次开始这项工作 将程序置于无限循环中 每次循环结束时 sleep 1 秒 像这样 在C中 int main int argc char argv while 1 do
  • 如何在 Android 中启用 Google Chrome 的“扫描新卡”选项?

    Google Chrome 具有扫描信用卡以在付款期间填充字段的功能 该功能适用 于 Android Chrome 不适用于 Android 的所有版本和设备 我已附上屏幕截图 It shows on other websites but
  • 在 C++11 智能指针中存储 std::thread

    In C 11 多于有什么优点或缺点当存储一个std thread直接作为班级成员 如下所示 std thread my thread 与存储相反std shared ptr or std unique ptr像这样的线程 std shar
  • 如何从 Google 版本地图中拖动的标记获取格式化地址

    我制作了一个谷歌地图 可以让你在文本字段中输入地址 然后 它会将您导航到您在文本字段中输入的地址 并留下一个可拖动的标记 拖动时会显示纬度和经度以及地理位置地址 我不想显示上述地址 而是希望当您拖动标记时在底角显示标记的地址 而不是从文本字
  • 纯 CSS 中基于复选框隐藏表格行

    对于那些关心的人来说 有一些背景故事 不久前我偶然发现了这个 https medium com front end hacking how it feels to learn javascript in 2017 a934b801fbe h
  • Windows 上的 Python str 与 unicode,Python 2.7,为什么 'á' 变成 '\xa0'

    背景 我使用的是 Windows 机器 我知道不再支持 Python 2 但我仍在学习 Python 2 7 16 我还有Python 3 7 1 我知道Python 3 unicode被重命名为str https stackoverflo
  • EntityManagerFactory 已关闭,Hibernate

    我最近创建了一个 Web 服务 它使用 Java 中的静态方法从数据库中获取项目列表 Web 服务运行良好 并将 JSON 返回给调用者 然而 它只能工作一次 如果您尝试刷新或提出新请求 我会收到一个EntityManagerFactory
  • J:牛顿法的隐性副词

    我发现在 addons math misc brent ijs 布伦特方法作为副词的实现 我也想构建牛顿法作为副词 但这比构建默认动词要困难得多 这是牛顿迭代的显式版本 newton i 1 u u d 1 有了这样的用法 2 o newt
  • 在哪里可以找到 javascript 本机函数源代码? [复制]

    这个问题在这里已经有答案了 哪里可以找到原生js函数的源码 比如我想看一下eval 功能 Chrome 和 Firefox 都是开源的 您可以在这些产品的源代码中查看 javascript 引擎任何部分的实现 其他浏览器有自己的实现 例如
  • Android 上的 Cordova 全屏黑条

    我的 android cordova 应用程序在屏幕顶部和底部出现黑色水平条 我尝试将全屏插件和标签添加到 config xml 但它不会消失 https i stack imgur com esFEL png https i stack
  • 从 mongodb 结果 java 中删除 _id

    我的代码是 DBCollection collection db getCollection volume DBCursor cursor collection find DBObject resultElement cursor next
  • Oracle 数据库查询在第二次运行时抛出错误

    我有一个 VBA 代码 我在其中调用 oracle 使用 ODBC 检索数据两次 第一次数据检索没问题 但第二次却说 RunTime Error 2147467259 80004005 Unspecified error 我的代码如下 注意
  • 如何禁用 NSDocument 的窗口标题弹出窗口

    我有一个基于 NSDocument 的应用程序 启用了自动保存 I d like to prevent this popup from showing 我尝试从 NSWindow 的 title representedFilename 和
  • 如何在访问 laravel 环境和类时在命令行上运行 php 脚本

    我在 Web 服务器上有一个 laravel 3 环境 但我想在命令行上运行 php 脚本 我想访问 laravel 环境中的任何 php 脚本 例如控制器 模型或视图文件 访问的相同类和方法 我怎样才能做到这一点 我强烈建议您将 PHP
  • Python - SQLite JSON1 加载扩展

    我想在 Python 中使用 SQLite 的 json1 扩展 根据官方文档 http sqlite org json1 html 它应该是一个可加载的扩展 我从以下位置获取了 json1 c 文件source http sqlite o
  • 在Python中解压文件

    我通读了zipfile文档 https docs python org 3 library zipfile html 但不明白如何unzip一个文件 仅介绍如何压缩文件 如何将 zip 文件的所有内容解压缩到同一目录中 import zip
  • Haskell:在更新函数中引用先前更新的列表元素

    假设我有以下定义 data Book Book id Int title String type Shelf Book 假设我有一个假设的功能 upd用于更新 updShelf Shelf gt Shelf updShelf all boo