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 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看

随机推荐

  • 插件的 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