如何计算函数被调用的次数,FP方式

2024-06-22

我目前正在通过SICP http://mitpress.mit.edu/sicp/与哈斯克尔。练习 1.15 询问一个函数被调用了多少次。这个想法可能是您应该使用替换方法,但我想知道如何在代码中执行此操作。

在命令式语言中,我们可以保留一个全局变量,并在每次调用函数时递增它。但是你会如何用 Haskell(或纯函数方式)来实现它呢?


您可以使用Writermonad 来完成此任务,前提是对相关函数的所有调用都可以组合到一个do block:

import Control.Monad.Writer

myFunc :: Int -> Int -> Writer (Sum Int) Int
myFunc a b = tell (Sum 1) >> return (a + b)

callMyFunc :: ((Int, Int, Int), Sum Int)
callMyFunc = runWriter $ do a <- myFunc 2 3
                            b <- myFunc 8 7
                            c <- myFunc 3 5
                            return (a, b, c)

main = putStrLn $
    "myFunc was called "
        ++ show (getSum $ snd callMyFunc)
        ++ " times and produced "
        ++ show (fst callMyFunc)

哪个输出:

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

如何计算函数被调用的次数,FP方式 的相关文章

  • ~/.cabal/config 中的“共享”是什么意思?

    我想 共享 会让cabal install更快 对吧 共享的默认值为 False 我们应该使用 True 还是 False 来共享 thanks 这意味着 还构建动态链接 又名共享 版本的库 这些版本与cabal install cabal
  • Common Lisp 中的重复元素 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试创建一个函数two argum
  • 在类型级别未定义

    通常 当我使用 Haskell 代码时 我会使用类型注释将内容存根并undefined foo String gt Int foo undefined 是否有类型级别的 未定义 我可以以类似的方式使用 理想情况下 与某种注释结合使用 typ
  • 为什么 Vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?

    例如 Vector Some 1 Some 2 Some 3 None flatMap n gt n 产生一个Vector 1 2 3 而不是给出错误 正如我在其他语言中看到的那样 flatMap当你有一个产生嵌套的映射器函数时使用 所以我
  • Coq:Type(n) 中的 Prop 与 Set

    我想考虑以下三个 相关的 Coq 定义 Inductive nat1 Prop z1 nat1 s1 nat1 gt nat1 Inductive nat2 Set z2 nat2 s2 nat2 gt nat2 Inductive nat
  • 为什么 Kleisli 不是 Monoid 的一个实例?

    如果您希望附加两个类型 a gt m b 的函数 以便只得到一个附加两个结果的相同类型的函数 您可以使用 Kleisli 来执行此操作 instance Monad m Monoid b gt Monoid Kleisli m a b wh
  • Scala 插入列表中的特定位置

    这是我确实解决的问题 但是作为一个完全命令式的 Scala 菜鸟 我觉得我发现了一些完全不优雅的东西 任何改进的想法表示赞赏 val l1 4 1 2 3 4 Nil original list val insert List 88 99
  • 在函数式编程中画UML类图有什么意义吗?

    我被要求在一个学校项目中展示UML我使用的图表 如果我这样做的话 实现该项目 但我正在做的项目是用 C 语言编写的 并且已经进行了功能编程 因此 我想证明 在不使用面向对象语言的情况下使用类图是没有意义的 但我担心这不是真的 并且无法证实这
  • Python 的“with”是一元吗?

    像我之前的许多鲁莽的先驱者一样 我正在努力穿越理解单子这片无路可走的荒原 我仍然在蹒跚学步 但我不禁注意到 Python 的某种类似 monad 的品质with陈述 考虑这个片段 with open input filename r as
  • 不明确的类型变量

    相关我之前关于遍历数据结构的问题 https stackoverflow com questions 1855371 avoiding boilerplate when dealing with many unrelated types 当
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • 当 Haskell 持久库中需要“Key”时,如何通过“Int”获取实体?

    我将持久性 orm 与 scotty Web 框架一起使用 我想通过 id 从 db 获取值 这些是来自 GET 请求的 有 get 函数接受 Key Entity 变量并返回 Maybe Entity 我使用以下代码从数据库获取值 k l
  • 自动函子实例

    给定以下代数类型 ghci gt data Foo a Foo a 然后我实例化其中之一 ghci gt let f Foo foo 最后 我想打电话给fmap将函数应用为 a gt b gt Foo a gt Foo b ghci gt
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • ghci 中严格求和/严格折叠导致内存爆炸

    正如中提到的为什么 sum takeWhile 以下是not炸毁记忆ghci https stackoverflow com questions 14298930 why does sum takewhile 10000000 1 use
  • 是否可以使用“-=”来处理文字?

    今天我发现 它声称 factorial n def do assert n lt 0 Negative factorial ret lt var 1 i lt var n while i do ret i i 1 return ret 可能
  • 如何构图“也许”镜头?

    如果我有嵌套记录的镜头 其中每个镜头返回一个Maybe 我怎样才能让它们组合起来 这样如果 遍历 中有任何东西返回一个Nothing最终结果是Nothing data Client Client clientProperties Maybe
  • 列出树中叶子的路径

    我正在尝试编写一个函数来查找树中叶子的所有路径 例如 给定一棵如下所示的树 1 2 5 3 4 6 输出列表将是 1 2 3 1 2 4 1 5 6 该函数的类型签名是 branches Tree a gt a 请注意 这使用了中定义的 T
  • 如何定义类别实例的相等性?

    为了证明例如类别法则对于某种数据类型的某些操作 如何决定如何定义相等性 考虑使用以下类型来表示布尔表达式 data Exp ETrue EFalse EAnd Exp Exp deriving Eq 试图证明这一点是否可行Exp形成一个具有

随机推荐

  • 在 Android TableLayout 中的两个元素之间绘制自定义线

    我有一个活动 其中的事件按时间线组织 但看起来很丑 I want to design a more beautiful timeline like this one 有没有简单的方法或库可以像我的示例一样在元素之间绘制线条
  • 如何获取有关按下哪个键多长时间的信息?

    想象一下这段代码 if navigator appName Opera document onkeypress function e console log e keyCode else document onkeydown functio
  • 如何使用@Query在日期之间选择Spring数据MongoDB

    我将 Spring 数据与 MongoDB 一起使用 我需要查找实际日期和提前 7 天之间的数据 我已经使用 Query 注释创建了存储库 并且不喜欢使用 Criteria 类 您知道如何在 Query 之间使用吗 提前致谢 您可以尝试以下
  • 为什么我的 dropzone javascript 表单不起作用?

    HELP 我正在构建网站的前端 并使用 dropzone js 进行图像上传 现在我已将 dropzone min js 和 dropzone css 包含在头部中 并将 dropzone 类分配给我想要转换的标签 尽管如此 表单字段并未变
  • 如何使用 MVC 4 制作提交按钮

    我正在尝试编写一个代码 从用户输入中获取姓氏和名字 并将这些值存储在 MVC4 的数据表中 我在 Accountcontroller cs 下添加了以下代码 这将创建一个提交按钮 一旦用户单击提交按钮 它会将用户输入添加到数据集中 priv
  • 将数据属性从选项标签传输到 UI 选择菜单项

    我需要将所有数据属性从选项标签传输到 UI 选择菜单项 li 标签 如何使用 API 做到这一点
  • 为什么 Android 会“复活”崩溃的应用程序?

    如果您有一个具有多个 Activity 的 Android 应用程序 并且 Activity A 启动 B 那么如果 Activity b 崩溃 进程将被终止 但会被 Android 操作系统恢复并再次启动 Activity A 而不是仅仅
  • 从单个 Maven 项目运行多个 SpringBootApplication 类

    有没有办法在运行时指定运行哪个SpringBootApplication的主类mvn spring boot run The docs http docs spring io spring boot docs 1 3 5 RELEASE m
  • Julia - 数组的绝对值

    我想获得以下数组的绝对值 x 1 1 22 3 3 01 1 即 我想要以下类型的输出 x2 1 1 22 3 3 01 1 但是当我输入 abs x 我收到错误 ERROR MethodError no method matching a
  • 当我的 javascript 呈现时,为什么我的
    标记显示为 [object Object]?

    我需要在句子之间添加中断标签 但是当我这样做时 我会得到 object Object 来代替换行符 有人可以告诉我如何解决这个问题吗 const openingText We re happy to hear your project is
  • C# 日期时间到 ODBC 日期时间转换错误

    我们正在尝试将 ODBC 与 SQL Server 2012 一起用于我们的新应用程序 因为 MS 正在逐步淘汰 OleDb 而我们希望尝试使其更容易 更容易 移植到其他数据库 问题是 当我尝试使用 ODBC 数据访问类时 在尝试保存日期时
  • Chrome开发者工具中不显示cookie

    i am using node express server and angularjs as frontend server sets the cookie and is shown correctly in the network re
  • 使用 va_list 获取 EXC_BAD_ACCESS

    按照文章中的示例进行操作http cocoawithlove com 2009 05 variable argument lists in cocoa html http cocoawithlove com 2009 05 variable
  • ng-href 中的 AngularJs if 语句

    我有一些动态创建的元素 每个元素都有不同的 ng href 我想根据某些元素给出不同的链接 当我尝试在 ng href 中编写函数时 它会将页面发送到 url 中的函数 因此它不起作用 我尝试做这样的事情 a a 我应该使用哪种方法来创建具
  • 使字符串“URL 安全”[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中的 URL 友好用户名 https stackoverflow com questions 2103797 url friendly username in php 有没有办法使字符串 UR
  • Postman:如何同时发出多个请求

    我想发布数据Postman谷歌浏览器扩展 我想用不同的数据发出 10 个请求 并且应该同时进行 在邮递员中可以这样做吗 如果是 有人可以向我解释如何实现这一目标吗 我想邮递员中没有这样的功能来运行并发测试 如果我是你 我会考虑Apache
  • Node.js:优雅重启和服务器正常运行时间,如何?

    我一直在使用实时应用程序Node js and Socket io 我想将其从本地测试阶段转移到与我们的一些用户一起进行测试 问题是 如果我关闭到服务器的 ssh 会话 它也会停止我开始使用的服务器node app js 我想过使用nohu
  • 如何计算圆圆周上点的(x或y)坐标?

    px and py是圆圆周上一点的 x 和 y 坐标 Given the center of the circle as cx cy the radius of the circle as r px 如何计算 的值py 谢谢 给定 px p
  • ProgressDialog 中没有进度旋转器

    我正在尝试创建一个 ProgressDialog 就像现在 Play 商店中几乎每个应用程序中看到的那样 我正在使用代码 getActivity runOnUiThread new Runnable Override public void
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变