在 Erlang 中计数(如何递增变量?)

2023-11-21

我已经弄清楚了 Erlang 风格的循环:尾递归,其函数采用所有“不变的变量”:

%% does something, 80 bytes at a time
loop(Line, File) -> loop(Line, File, 0).
loop(Line, File, Count) -> 
    do_something(Line, Count),
    case file:read(File, 80) of
        {ok, Line2} -> loop(Line2, File, Count + 1);
        eof -> file:close(File);
        {error, Reason} -> {error, Reason}
    end.

但是,在 Erlang 中增加计数器的最佳方法是什么?在大多数编程语言中,计数的方式是通过递增变量(即count += 1;)。 Erlang 的变量不会变化,所以我们必须有创造力。幸运的是,我们还有选择……

我们可以在函数中传递一个 Counter 变量,并在每次函数调用时递增它。我们可以使用进程字典来存储计数,并且get and put来增加它。我们可以使用ETS,流程的本地数据存储。我们可以使用计数器进程(!!!):

loop(Count) ->                            
    receive                                   
        { incr } -> 
            loop(Count + 1);              
        { report, To } ->                     
            To ! { count, Count },            
            loop(Count)                           
    end.                                      

incr(Counter) ->
    Counter ! { incr }.

get_count(Counter) ->    
    Counter ! { report, self() },
    receive
        { count, Count } -> Count
    end.

我确信还有其他方法,具体取决于范围。在 Erlang 中增加变量的“最佳实践”是什么?


不要使用进程字典。

您期望的“正常”循环(即for循环或一个do while)通常在 Erlang 中的递归函数中实现,因此如果您要递增“正常”计数器,请在函数调用中执行此操作,就像您在顶部显示的那样。

不要使用进程字典。

如果您错过了,我可以指出您不应该使用流程字典吗?

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

在 Erlang 中计数(如何递增变量?) 的相关文章

  • 如何在 erlang 中格式化包含整数的平面字符串?

    在erlang中 我想格式化一个包含整数的字符串 并且我希望结果被展平 但我明白了 io lib format sdfsdf B 12312 115 100 102 115 100 102 32 12312 我可以使用下面的代码获得所需的结
  • Erlang 记忆的简单示例

    假设您有一个简单的函数 对于较大的值来说 它的成本可能会相当高 fact 0 gt 1 fact N gt N fact N 1 在哪里可以找到使用缓存 或记忆 函数值的简单示例dets 任何其他方便记忆的方法都将受到高度赞赏 根据您的情况
  • 在 Erlang 中确定传入 TCP/IP 连接的 IP 地址和端口

    我想获取传入 TCP IP 连接的 IP 地址和端口号 很遗憾gen tcp s accept and recv函数只返回一个套接字 而gen udp s recv函数还返回地址信息 有没有一种简单的方法来收集属于 Erlang 中套接字的
  • 如何使用 Erlang 发送推送通知?

    我正在尝试使用 Erlang 向 APNs 发送推送通知 这是我到目前为止想出的代码 module apnstest2 export connect 0 connect gt application start ssl ssl seed s
  • Erlang 代码的持续集成服务器

    您使用什么类型的敏捷工具进行 Erlang 开发 什么持续集成 http en wikipedia org wiki Continuous integration您使用 CI 服务器来构建 Erlang 代码吗 我得到的唯一参考来自 Quo
  • erlang中如何将中缀转换为后缀?

    我刚刚遇到这个帖子 https stackoverflow com questions 4621151 the shortest way to convert infix expressions to postfix rpn in c 相当
  • Erlang:NIF 和透析器警告

    在实施 NIF 时 Dialyzer 给了我 函数 crc16 1 没有本地返回 可能是因为我这样做exit在 erl 模块中 如官方文档推荐 module my nifs export crc16 1 on load init 0 ini
  • 如何在没有任何服务器的情况下创建 P2P 网络聊天?

    有没有一种方法可以在没有任何服务器的情况下创建 P2P 网络聊天 可以 但是您必须决定见面地点 如果你的朋友把他的IP发给你 你就可以连接 那么你只需要告诉更多的人加入即可 一段时间后 你会变得越来越大 然后 如果网络上的某个链接发生故障
  • Erlang TCP 套接字关闭

    为了学习 Erlang 我正在尝试实现一个基于gen tcp 不幸的是 我的代码似乎触发了一些有线行为 为了演示这个问题 我附上了我的实现的最小化版本 它足以重现该问题 无论 HTTP 请求是什么 它都只是传递静态 200 OK 当我尝试运
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • Erlang - 导入 GPG 公钥

    我正在尝试在 Erlang 中做一些与公钥相关的事情 它们要求我跟踪公钥 根据这一页 http www erlang org doc apps public key using public key html id61611 我应该能够通过
  • 我们如何有效地处理 mnesia 记录的时间相关约束?

    我正在将记录写入mnesia 该记录应该保存在那里 仅在允许的时间 24 小时 内 24小时后 在用户修改其中的一部分之前 系统应该自动删除它们 例如 用户获得免费通话时间 用于语音通话 他们应该在给定时间内使用它们 如果他们不使用它 24
  • 如何修改erlang中的记录?

    我需要修改操作记录中的值 place 和 other place op action walk from place to other place preconds at place me on floor me other place p
  • 停止 Erlang 守护进程

    除了跑步 killall 9 beam smp 当我知道 Erlang 节点的情况时 如何以编程方式杀死它 sname 如果我不希望心跳监视器重新启动该进程 如何确保上述问题的任何答案也会终止心跳 有没有一个不错的指南来将 Erlang 部
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • Erlang 应该如何处理通用数据?

    假设我正在使用 Erlang 构建游戏服务器 每个用户检查某些内容 例如找到最近的玩家 是很常见的 因此通常有一个管理器类 在上面的例子中 我们使用互斥锁 据我所知 Erlang 通常会为每个 TCP 连接 用户会话 创建新的 Erlang
  • Erlang 中的接受器池和负载平衡?

    From http www erlang org doc man gen tcp html accept 1 http www erlang org doc man gen tcp html accept 1 值得注意的是 accept 调
  • Erlang 中的非终止函数类型

    我正在学习 Erlang 并尝试使用 Dialyzer 在可能的情况下获得最大的类型安全性 有一点不太明白 什么是类型非终止的函数以及如何表示它 spec 有人能解释一下吗 永远循环且永不终止的函数具有返回类型no return 该返回类型
  • 为什么 epmd 进程不退出?

    在我退出 erlang shell 后 epmd 进程仍然存在 这是一个错误还是一个功能 这是很正常的 EPMD 是一个主机守护进程 当人们打算使用分布式节点时 就需要它的存在 当仅在同一台机器上使用多个节点时 它也很有用
  • Erlang:将元素“添加到元组之前”

    是否可以编写一个与此函数等效的更快的函数 prepend X Tuple gt list to tuple X tuple to list Tuple 在我看来 这种事情是不被鼓励的 如果您想要一个列表 请使用一个 Erlang 入门 ht

随机推荐

  • Rails 中具有动态内容的侧栏设计模式

    我想要一个右侧栏 其中每个页面的内容都会发生变化 例如 当我在 朋友 页面时 侧栏应显示 新朋友 当我在帐户页面时 侧栏应显示最近的活动 我应该如何处理这个问题以尊重 Rails 设计模式 我听说过 Cells gem 但我不确定是否使用它
  • Nginx 不会重新启动。 。 。 nginx.service 的作业失败,因为控制进程退出并出现错误代码

    我正在关注一个关于设置 Nginx 的 YouTube 视频 我正在重新启动 当我得到其中的部分时 它给出了 我需要编辑服务器块文件 sites enabled default 我完全按照他们在视频中所做的操作 但是当保存并尝试重新启动时
  • Ruby 相当于 C# 的“yield”关键字,或者创建序列而不预先分配内存

    在 C 中 你可以这样做 public IEnumerable
  • Python ElementTree - 按顺序迭代子节点和文本

    我正在使用第三个 python 和 ElementTree API 我有一些以下形式的 xml
  • 如何将 angularjs ng-click 与 html5 数据列表一起使用

    我正在使用 AngularJS 并且我想使用该指令ng click当选择数据列表 html5 的元素时 这是我的实际代码的示例
  • Maven 使用 JAX-WS 2.1 而不是 JAX-WS 2.2

    我将 Netbeans 7 与 Maven 2 2 1 和 jaxws maven plugin 1 12 一起使用 代码部署在 Glassfish 3 1 上 或者当我编译它时就会部署 当我构建项目时 wsimport 按预期运行并从提供
  • Vim 变量语法高亮

    我想更改我的 vim 配置文件 以允许仅突出显示我声明的变量 而不是关键字 这篇文章展示并解释了我的意思 替代语法突出显示 我是 vim 的初学者 我从未更改过默认配置文件 有人能指出我正确的方向吗 作为概念证明 我尝试过 let vars
  • Java 9 ServiceLoader运行时模块加载和替换

    我刚刚读到 Java 9 模块系统 我想问一下ServiceLoader 当应用程序已经启动时 有什么方法可以添加服务实现吗 删除一些服务实现怎么样 使用案例 我将有一些可以计算某些内容的应用程序 计算算法将在某些服务 Java 9模块 中
  • java 整数引用

    我有一个问题 public class Jaba public static void main String args Integer i new Integer 0 new A i System out println i new B
  • 如何首先使用EF核心代码制作联接表

    我有这三个模型 public class Card public int ID get set public string Name get set public string Class get set public string Ima
  • 铸造和转换有什么区别? [复制]

    这个问题在这里已经有答案了 埃里克 利珀特 Eric Lippert 的评论这个问题让我彻底困惑了 C 中的强制转换和转换有什么区别 类型转换是一种告诉编译器 对象 X 实际上是类型 Y 继续这样对待它 的方式 转换是说 我知道对象 X 不
  • 在模式内部/上方显示谷歌选择器

    有没有办法让谷歌驱动器选择器显示在自定义模式或 div 中 我有一个模式 其中有多个提供商用户可以选择 例如谷歌 保管箱 该模式包含其中的所有 js 和 css 文件 所以当我点击谷歌驱动器选择器时iframe嵌入到body在我的模态后面
  • 重新加载/刷新 Kendo Grid

    如何使用 Javascript 重新加载或刷新 Kendo Grid 通常需要在一段时间或用户操作之后重新加载或刷新网格 您可以使用 GridName data kendoGrid dataSource read GridName data
  • 在单个查询中更新多个三元组的 SPARQL 更新示例

    谁能指点我一个valid任何文档中的 SPARQL 中的 UPDATE 语句 无论是 W3C virtuoso 语义网页还是您自己的自定义代码等 它必须符合 WHERE 规范 并且在单个查询中更新多个三元组 Thanks 编辑 示例 这是我
  • PyQt:如何获取大部分 QListWidget

    该代码构建了一个对话框 其中包含一个QListWidget和一个单一的Q按钮 单击该按钮将添加一个列表项 右键单击列表项会弹出右键菜单 其中包含 删除项 命令 选择 删除项目 命令将从列表小部件中删除列表项目 看看如何实现以下 ListWi
  • 集成 BouncyCastle Jar 时遇到问题

    好吧 我现在就说我对Java知之甚少 他们给了我一个充气城堡罐子 并告诉我里面装有我完成这项任务所需的东西 Jar 文件是bcprov jdk15on 147 jar 我也在学校维护的 Unix 机器上执行此操作 因此我无法进入并使用所有
  • 使用 PhoneGap HTML 在 iOS 中自定义 JavaScript 警报

    我的应用程序有几个 JS 警报 它似乎总是显示页面名称 索引 html 有没有办法将index html更改为我的应用程序的名称或自定义文本 Example My App Which replaces index html alert I
  • jquery ui滑块显示值

    我有一个值为 1 5 的滑块 它更新 ID 为 天 的隐藏输入 function slider slider value 3 min 1 max 5 step 1 slide function event ui days val ui va
  • 在循环内粘贴指定的 3 列

    df lt data frame expand grid c a b c c p q r c x y z c l m n 我有这个有 4 列的表 我想将结果放在一个向量中 这样它应该是 paste0 df Var1 df Var2 df V
  • 在 Erlang 中计数(如何递增变量?)

    我已经弄清楚了 Erlang 风格的循环 尾递归 其函数采用所有 不变的变量 does something 80 bytes at a time loop Line File gt loop Line File 0 loop Line Fi