递归记忆化

2023-11-25

我试图理解memoization的Haskell实现,但我不明白它是如何工作的:

memoized_fib :: Int -> Integer
memoized_fib = (map fib [0..] !!)
    where fib 0 = 0
              fib 1 = 1
              fib n = memoized_fib(n - 2) + memoized_fib(n - 1)

首先,我什至不明白为什么“map”函数获取三个参数(函数 - fib、列表 [0..] 和 ||),而不是两个参数。

Updated:

我尝试重写代码,但得到不同的结果:

f' :: (Int -> Int) -> Int -> Int
f' mf 0 = 0
f' mf 1 = 1
f' mf n = mf(n - 2) + mf(n - 1)

f'_list :: [Int]
f'_list = map (f' faster_f') [0..]

faster_f' :: Int -> Int
faster_f' n = f'_list !! n

为什么?我的推理有什么错误吗?


第一:Haskell 支持运算符部分。所以(+ 2)等于\ x -> x + 2。这意味着表达式map等于\ x -> map fib [0..] !! x.

其次,它是如何工作的:这是利用 Haskell 的按需要致电评估策略(其惰性)。

最初,该列表由map不予评价。然后,当您需要访问某个特定索引时,将评估该点之前的所有元素。但是,一旦某个元素被求值,它就不会再次被求值(只要您引用的是同一个元素)。这就是让你记忆的原因。

基本上,Haskell 的惰性求值策略涉及记忆强制值。这个记下来了fib函数仅依赖于该行为。

这里“强制”一个值意味着评估一个称为 thunk 的延迟表达式。因此,列表最初基本上存储为列表的“承诺”,并强制将“承诺”转变为实际值,以及更多值的“承诺”。 “承诺”只是重击,但我希望称其为承诺更有意义。

我稍微简化了一点,但这应该可以澄清实际的记忆是如何工作的。

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

递归记忆化 的相关文章

  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 管道中缺少 ResourceT 实例

    我在尝试使用时遇到奇怪的错误ResourceT http hackage haskell org package conduit 1 0 9 1 docs Data Conduit html t 3aResourceT来自管道 1 0 9
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i
  • 为什么以下内容会并行运行而不是顺序运行?

    给定以下函数evalPair parPair and deepSeq分别 evalPair Strategy a gt Strategy b gt Strategy a b evalPair sa sb a b do a lt sa a b
  • Haskell:GHC 无法推断类型。由类型签名错误绑定的刚性类型变量

    我看过几篇主题相似的帖子 但它们并不能真正帮助我解决我的问题 所以我才敢重复 现在我有一个带有签名的函数 run Expr query gt RethinkDBHandle gt query gt IO JSON 这是一个数据库查询运行函数
  • 如何处理或避免BlockedIndefinitelyOnSTM异常?

    我花了很多时间来解决我正在处理的应用程序中遇到的问题 该应用程序是一个 Web 应用程序 使用 scotty 公开 REST 端点 它使用一个TVar保持其更新的状态STM a由前端层触发的动作 由于该应用程序基于事件溯源原则 因此业务层生
  • Haskell 中实例声明的参数顺序切换

    我想进行实例声明 但自由类型变量不是最后一个变量 例如 我有一个类声明 class Poppable m where tryPop m a gt Maybe a m a 现在我想让 Q PSQ 优先级队列 成为 Poppable 的实例 具
  • 为什么我不能将 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 - 翻转具有两个参数的类型类的参数

    我有一个多参数类型类 它提供了一个可以交换其参数的函数 class Swappable a b where swappable a gt b gt Bool So if a and b form Swappable a b then b a
  • Haskell:从后面访问列表

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

    如何将以下 Java 实现转换为 Haskell 这里的主要目的是拥有一个包含作为特定接口的子类型的各种元素的列表 我尝试制作下面的 Haskell 版本 但未能达到我的目的 这里的重点是xs有类型 Bar 而不是Foo a gt a 这是
  • Haskell Stack 包安装错误

    user stack install dictionaries Error While constructing the build plan the following exceptions were encountered In the
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • 使用 GHC.Generics 恢复类型定义

    昨天我尝试回答这个问题是关于数据类型的表示 https stackoverflow com questions 22715572 a serializable representation of a data type for client
  • 无法让 wxHaskell 在 Mac 上从 ghci 工作

    我正在尝试跑步一个例子 http www haskell org haskellwiki WxHaskell Quick start Hello world in wxHaskell using EnableGUI function htt
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 关注点分离:什么时候最好将语义与语法分离?

    Choices 类型类的出色之处在于它们允许我们将额外的结构连接到现有类型 从而使我们能够推迟一些设计决策 而不是在构思时匆忙做出决定 另一方面 例如 在面向对象编程中 我们被迫考虑类型需要立即执行什么操作 以及稍后出现的或需要的任何附加结
  • 为什么阴谋集团重新安装“总是危险的”?

    使用 Cabal 重新安装软件包时 通常会看到以下警告 警告 请注意 重新安装总是很危险的 无论如何继续 此消息背后的一些原因是什么 目前 重新安装软件包意味着破坏性地覆盖已安装的软件包 如果旧包对系统有任何反向依赖性 它们将不再工作 为了
  • 带边界的 haskell 列表数据类型

    我有以下类型定义来表示卡片 data Suit Hearts Spades Diamonds Clubs data Rank Numeric Integer Jack Queen King Ace data Card Card Rank S
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr

随机推荐

  • 获取可排序 jQuery 中拖动列表项的 ID

    我有这个html ul li First li li Second li li Third li ul 和这个 sortable jQuery function listofpages sortable 如何获取被拖动元素的id 在 的里面
  • 从 IEnumerable 转换为列表 [重复]

    这个问题在这里已经有答案了 我想转换自IEnumerable
  • 如何设置 eclipse.ini -vm 选项?

    我安装了Maven插件Eclipse 然后我收到如下错误 请确保 eclipse ini 中的 vm 选项指向 JDK 我该如何使用 vm在 eclipse ini 中选择指向我的 JDK 我的解决方案是 vm D work Java jd
  • 使用 PHP 将 jpg 图像转换为 gif、png 和 bmp 格式

    如何使用 PHP 将单个 jpg 图像转换为 3 种不同的图像格式 gif png 和 bmp 您首先从文件中创建一个图像对象imagecreatefromjpeg 然后 您将该对象转储为不同的格式 使用图像gif 例如 imageObje
  • 使用 ng-repeat 进行 Angularjs 表排序

    我有一个 HTML 表格 想要对我的记录进行排序 scope records在 ctrl 中 通过单击表标题 scope headers在 ctrl 中 任何人都可以解释为什么它有效 th a headers 0 a th th a hea
  • git 预提交钩子代码格式化与部分提交?

    有没有办法有一个预提交钩子来自动格式化代码 对于 示例与astyle 但是确实not销毁部分提交 工作流程 edit a file txt git add p file txt add one chunk but not another g
  • 如何在 Swift 中获得 Bool 的相反值?

    我的具体情况是我正在尝试切换导航栏的隐藏和显示 let navHidden self navigationController navigationBarHidden self navigationController setNavigat
  • iOS - 如何发出 SOAP 请求并接收关注响应

    我知道网络上有很多关于 如何在 iOS 中使用 SOAP 的内容 但我仍然未能遵循 SOAP 请求和响应 非常感谢帮助 我用的是简单的NSURLConnection用于请求和响应 SOAP 请求 POST asmx HTTP 1 1 Hos
  • 服务器端语音识别[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人知道已经托管的任何好的服务器端语音识别引擎吗 IE 我希望能够调用一个简单的 Web API 来发布一些声音数据并获取文本 不一定是免费的 但希
  • 获取当前域名

    我的网站在服务器上http www myserver uk com 在此服务器上我有两个域 one com and two com 我想使用 PHP 获取当前域名 但是如果我使用 SERVER HTTP HOST 然后它向我展示 myser
  • 如何在 Rails 连接表迁移中正确索引字段?

    Rails 4 引入了生成连接表迁移的功能 bin rails generate migration CreateTeamsUsersJoinTable team user 这会产生以下文件 class CreateTeamsUsersJo
  • 使用 jQuery,如何仅查找可见元素并保留隐藏元素?

    所以我从第 1 4 项开始 div class someDiv bold italic style display none Lorem div div class someDiv regular italic style display
  • 如何对使用 perlcc 编译的 Perl 程序进行逆向工程?

    我继承了一个在 Unix 上有 编译 perl 脚本的环境 是否可以对其进行反编译 反向工程 无论术语是什么 并从编译后的目标代码中获取源代码 可能不可能 但我想我会问而不是假设 谢谢 凯文 省略已经介绍过的字节码后端 tchrist 只讨
  • CakePHP 2个单独的登录表

    我有一个 Cake 网站 它需要有两个单独的登录名 每个登录名都有自己的登录表单并看到不同的页面 最好有两个不同的表 因为两类人之间没有相似之处 每个登录表单仅由某些人使用 他们永远不会登录另一个表单 反之亦然 还有 两个登录表之间有关系
  • bean实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:

    我的控制器中的构造函数有一些问题 我尝试在构造函数中调用一项服务 该服务在 AbstractController 中自动装配 但我遇到了空指针异常 一个组件 Component RestController RequestMapping v
  • Java/XSLT:找不到匹配的 1 参数函数

    我收到以下错误 javax servlet ServletException Cannot find a matching 1 argument function named http exslt org dynamic evaluate
  • Spring Boot 数据源配置

    我正在尝试使用application properties文件来配置 Spring Boot 必须使用的数据源 我已将以下属性放入其中 spring datasource driverClassName org postgresql Dri
  • 如何将 URI 转换为文件 Android 10

    如何在 android 10 及以上版本中从 URI 获取文件对象或将 URI 转换为文件对象 final File file new File Environment getExternalStorageDirectory read me
  • Lucene索引从4.6版本升级到8.0.0

    我正在尝试将 Lucene 索引从 4 6 升级到 8 0 0 当我尝试使用以下方式升级工具时 java cp lucene core jar lucene backward codecs jar org apache lucene ind
  • 递归记忆化

    我试图理解memoization的Haskell实现 但我不明白它是如何工作的 memoized fib Int gt Integer memoized fib map fib 0 where fib 0 0 fib 1 1 fib n m