小编tor*_*tte的帖子

在Erlang进程中使用映射而不是记录来保存状态是否有任何优势?

我见过的大多数书籍或在线资源都使用记录来保持一个过程的状态(可能因为这是多于(?)十年的方式).另一方面,map有效地用于替换stdlib中的元组(例如,supervisor模块中的childspecs).

作为一个例子,我正在通过Learn You Some Erlang的有限状态机章节工作,state记录可以替换为在init/1需要的回调中声明的映射gen_fsm.

  • 我不需要记录声明,而且到目前为止我所阅读的大部分内容都是最佳实践,因为.hrl文件使得跟踪错误变得更加困难.
  • 参考函数子句中的进程状态也会更短但是它们都清楚地传达了状态变量的结构,并且几个额外的字符不是问题.

此外,它会更有效吗?
我知道一个经过深思熟虑的基准测试可以回答我的问题,但我只用了几个星期就学习了Erlang,而地图 模块相当新,而且还在变化.

更新:感谢我给出了可怕的建议,我更彻底地阅读了地图上LYSE章节,答案很明确:

使用记录的优点是密钥在编译时是已知的,这带来了优势

  • 快速访问特定值(比动态更快)
  • 额外的安全(早期崩溃而不是腐败状态)
  • 更容易检查类型

这些记录绝对适合进程的内部状态,尽管偶尔会编写更冗长的code_change函数.

另一方面,Erlang用户将使用记录来表示复杂的嵌套键/值数据结构(奇怪地类似于面向对象语言中的对象),这些数据结构经常跨越模块边界,因此地图将有很大帮助.记录是该工作的错误工具.

erlang

5
推荐指数
1
解决办法
864
查看次数

关于 Nix 包管理的 Nix 表达式是什么?

即使在阅读了 Nix 手册之后,仍然对 Nix 表达式的真正含义感到困惑。有时它们被称为派生,但存储派生也有其他含义。

nix

5
推荐指数
2
解决办法
576
查看次数

在erlang接收语句中引入"保存队列"的目的是什么

我是erlang的新手,并从Joe Armstrong的"Programming Erlang"开始教程.

我对8.6中选择性接收中提到的"保存队列"感到困惑.如果消息根本不匹配,为什么不直接删除它?将它放回邮箱以便以后处理的目的是什么?如果它是默认行为,那些垃圾消息(意味着它们无法匹配)可能会导致性能损失,因为它们会在不释放的情况下累积.

我想知道我是否误解了这一部分.我试图检查进程邮箱的内容以便更好地理解,但我无法做到.

请帮助,我将不胜感激任何证明有用的代码片段,谢谢.

erlang

4
推荐指数
1
解决办法
589
查看次数

如何在谷歌计算引擎上连接到远程 PostgreSQL 服务器?

我已经在谷歌云上安装了一个 PostgreSQL,我希望能够使用 pg-admin 从我的 PC 远程访问它。

当我尝试连接到我的实例时,我确实收到以下错误:

无法连接到服务器:

无法连接到服务器:连接被拒绝 (0x0000274D/10061) 服务器是否在主机“[我的 VM 实例的外部 IP]”上运行并接受端口 5432 上的 TCP/IP 连接?

我认为这可能是因为谷歌云防火墙阻止了我(也许!),我为我的实例指定了以下防火墙,我使用我的 IP 地址来定义源过滤器: 在此处输入图片说明

我是否错过了一些东西,因为我仍然无法访问它,有人可以帮助我吗?我已经不知道了,我已经检查了很多教程,并且我做了很多我应该解决的事情。有人知道吗?

postgresql google-compute-engine

4
推荐指数
2
解决办法
6238
查看次数

在非NixOS系统上使用nix在Erlang> 19上安装Elixir的规范方法是什么?

从将Nix软件包管理器安装在非NixOS机器上之后,请向十岁的孩子解释一下。例如,我在Mac上,甚至没有~/.config目录。

我找到了以下(可能是)相关资源,但我无法将它们拼在一起:


最后,我安装了带有Erlang 21的最新Elixir,如下所示,但是我确定这不是应该做的。

$ # Cloned the `nixpkgs` repo from github and started the repl
$ # in the same the directory.
$
$ nix repl
Welcome to Nix version 2.0.4. Type :? for help.

nix-repl> :l nixpkgs
Added 9182 variables.

nix-repl> pkgs.beam.packages.erlangR21.elixir
«derivation /nix/store/vcadn6d6wgk1yjlci458vy8jqv66wwdy-elixir-1.6.5.drv»

nix-repl> :q

$ nix-store --realise /nix/store/vcadn6d6wgk1yjlci458vy8jqv66wwdy-elixir-1.6.5.drv
Run Code Online (Sandbox Code Playgroud)

erlang elixir nix

4
推荐指数
2
解决办法
296
查看次数

为什么函数组合在应用于带有多个参数的函数时有效?

我想我在写出步骤时理解了函数应用程序的工作原理,但类型签名算术并没有在我的脑海中相加。对冗长的前奏表示歉意(没有双关语)。

\n

举一个具体的例子,这个例子是Stefan H\xc3\xb6ck\ 的 Idris2 教程的一个稍微修改过的例子:

\n
plusTwo : Integer -> Integer\nplusTwo = (+2)\n\ntwice : (Integer -> Integer) -> Integer -> Integer\ntwice f n = f (f n)\n
Run Code Online (Sandbox Code Playgroud)\n

在 REPL 中:

\n
> twice plusTwo 3\n7\n\n> (twice . twice) plusTwo 3\n11\n
Run Code Online (Sandbox Code Playgroud)\n

我知道的

\n

haskell functional-programming idris

4
推荐指数
1
解决办法
232
查看次数

lambda 演算中的 Eta 抽象有何用途?

lambda 演算中的 Eta 抽象意味着跟随。

函数f可以写成\x -> f x

  • Eta 抽象在减少 lambda 表达式时有什么用处吗?
  • 它只是某些表达式的另一种书写方式吗?

实际用例将不胜感激。

lambda-calculus

3
推荐指数
1
解决办法
1155
查看次数

AgensGraph-Btree VS Neo4j-IndexFree

为了有效处理数据,Neo4j表示他们以"无索引邻接"的方式搜索图形数据.但是,我知道AgensGraph使用PostgreSQL的"Btree"方式进行查询

与"无索引邻接"相比,使用PostgreSQL的"Btree"有什么好处?

postgresql b-tree neo4j agens-graph

3
推荐指数
1
解决办法
642
查看次数

如何根据其类型签名找到Haskell函数?

例如,我已经有一段时间没有使用Haskell了,忘记了const函数的名称,但是记得它的类型签名是a -> b -> a

haskell

3
推荐指数
1
解决办法
57
查看次数

使用空提交启动 Git 存储库有什么好处?

找到一篇关于使用空提交启动存储库的文章。看了几遍帖子,还是不明白其中的道理:

\n
    \n
  1. \n
    \n
    1.git log和其他命令会出现可怕的错误消息。
    \n
    2. 您可以\xe2\x80\x99git reset回到初始状态。
    \n
    \n

    根据上面前两节的标题,我怀疑这可能是一篇讽刺作品。

    \n
  2. \n
  3. \n
    \n
    3. 您可以\xe2\x80\x99t 重新设置初始提交的基准。
    \n
    \n

    然而,这似乎是一个有效的观点(与链接文章《鲜为人知的 Git 命令》相呼应)呼应),但当我开始思考它时,我只是看不出这在实践中有何用处(或者什么)它试图阻止)。

    \n
  4. \n
  5. 原帖链接:(2008?)Git Magic - 附录\xc2\xa0A.\xc2\xa0Git 缺点:初始提交

    \n

    我同意“从 0 开始计数”的观点,但除了迂腐之外,仍然不明白空的初始提交有什么好处。

    \n
  6. \n
  7. 原帖链接:(2010) 如何初始化我的 Git\xc2\xa0repositories | 凯文·德尔戴克

    \n

    这篇文章确实给出了使用此技巧进行代码考古目的的基本原理(仍然不了解具体细节,但我知道这是针对特殊用例的)。

    \n
  8. \n
\n

第 3 项和第 4 项中的链接显然已经过时,并且整个想法显然从未成功(?),但我仍然想知道它是否仍然有好处 - 或者从那时起 Git 的变化消除了它的必要性。

\n
\n

当然,在输入所有这些内容后,我找到了 SO 线程:

\n

git

3
推荐指数
1
解决办法
83
查看次数