小编Pas*_*cal的帖子

为什么Dialyzer告诉我这个有趣的合同有重叠的域名?

我感兴趣地阅读在线书" 学习你一些二郎 ",并尝试一些练习来检查我的理解.

我对fifo示例进行了一些修改,在类型规范和Erlang章节中,尝试定义"typed_fifo(T)"(所有元素必须是相同类型T的fifo)

我的类型规范是:

-type typed_empty_fifo():: {fifo,[],[]}.

-type typed_nonempty_fifo(A):: {fifo,nonempty_list(A),list(A)} | {fifo,[],nonempty_list(A)}.

-type typed_fifo(A):: typed_empty_fifo()| typed_nonempty_fifo(A).

当我在以下功能规范中使用它时:

-spec empty(typed_empty_fifo()) - > true;

  (typed_nonempty_fifo(_)) -> false.
Run Code Online (Sandbox Code Playgroud)

空({fifo,[],[]}) - > true;

空({fifo,A,B})当is_list(A),is_list(B) - > false时.

Dialyzer告诉它因为重叠域而忽略规范.

有人能告诉我哪里弄错了吗?

我有另外一点,在尝试定义类型的fifo之前我有一个很好用的版本,An Dialyzer告诉我没有什么可以防止使用不正确的列表.令人惊讶的是,我找不到一种简单的方法(我可以在警卫中使用)来测试列表的正确/不正确的字符.

这真的很奇怪,因为当我使用bif长度/ 1时,它会因为badarg而失败!

23> L = [1,2 | 3].==> [1,2 | 3]

24> is_list(L).==>是的

25>长度(L).==>异常错误:错误的参数

 in function  length/1

    called as length([1,2|3])
Run Code Online (Sandbox Code Playgroud)

谢谢

erlang types dialyzer

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

为什么我在erlang 21中的代码出错但在erlang 20中却没有?

当我在Erlang 21中执行以下操作时出现错误.

inets:start(),
ssl:start(),
httpc:request(post,
             {"https://sandbox.itunes.apple.com/verifyReceipt", [], "application/json", []},
             [], []).
Run Code Online (Sandbox Code Playgroud)

错误是:

=INFO REPORT==== 3-Oct-2018::19:32:47.728491 ===
TLS client: In state hello received SERVER ALERT: Fatal - Handshake Failure

{error,{failed_connect,[{to_address,{"sandbox.itunes.apple.com",443}},
                        {inet,[inet],{tls_alert,"handshake failure"}}]}}
Run Code Online (Sandbox Code Playgroud)

当我在Erlang 20中做同样的事情时,它工作得很好.

谁能让我知道可能出错的地方?

erlang

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

Erlang 跟踪器中的堆栈跟踪

是否可以在跟踪中返回堆栈跟踪?我正在使用:dbg.tp/3:dbg.tracer/2来获取调用模块的跟踪。我尝试了caller函数(参见文档: https: //erlang.org/doc/apps/erts/match_spec.html),但它给了我堆栈中的下一个调用(即{:erl_eval, :do_apply, 6}),我需要的是第一个函数是在我的项目中定义的。

对于上下文,处理函数传递给tracer/2

    handler_fun = fn {:trace, _pid, :call, {_m, _f, _a}, dump}, _ignored ->
      IO.puts(dump)
    end
Run Code Online (Sandbox Code Playgroud)

和 tp 调用(现在我只使用进程转储,它以二进制形式提供堆栈,但我想以可以在代码中解释而不是解析它的形式获取它):

:dbg.tp(module, :_, [{:_, [], [{:message, {:process_dump}}]}])
Run Code Online (Sandbox Code Playgroud)

我愿意使用与跟踪/dbg 不同的工具。

erlang trace elixir beam

5
推荐指数
0
解决办法
174
查看次数

为什么在 Erlang/OTP 20 上评估这个列表理解需要太长时间?

找到总和 = 100 的任何 5 个数字。这可以在循环中完成,但我向朋友展示了列表理解,结果发现这在我的 Mac Book Pro、酷睿 i7、2.2GHz 上需要 30 多分钟

[[A,B,C,D,E] || A <- lists:seq(1,100),B <- lists:seq(1,100),C <- lists:seq(1,100),D <- lists:seq(1,100),E <- lists:seq(1,100),(A + B + C + D + E) == 100]

如果将问题更改为连续的 5 个数字,则构建的列表理解甚至需要更长的时间。如果我要使用列表理解来解决这个问题,我做得对吗?如果是,为什么需要太长时间?请提供一个可能更快的解决方案,也许使用循环。

erlang

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

为什么 from tkinter import * 不导入 Tkinter 的消息框?

我正在学习 Python,当我使用 tkinter 尝试一些代码时,我遇到了这个问题:

我使用以下行导入 tkinter 的所有定义:

from tkinter import *
Run Code Online (Sandbox Code Playgroud)

然后我尝试打开一个消息框:

messagebox.showinfo(message='My message')
Run Code Online (Sandbox Code Playgroud)

但是当我运行程序时,如果必须执行这一行,我会收到消息:

Traceback (most recent call last):
  File ...
  ...
NameError: name 'messagebox' is not defined
Run Code Online (Sandbox Code Playgroud)

如果我添加到导入行显式导入消息框:

from tkinter import *
from tkinter import messagebox
Run Code Online (Sandbox Code Playgroud)

它有效,但我不明白我必须添加此导入的原因。

python tkinter python-import python-3.x

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

使用typer的意外结果

我决定在我的一些代码中添加类型定义,然后我运行Typer来获得一个起点(erlang 15b02,typer 0.9.4).

我选择了一些结果来检查是否一切都很好,发现这个结果我不明白:

par(true, o) -> "(";
par(true, f) -> ")";
par(_, _) -> "".
Run Code Online (Sandbox Code Playgroud)

产生规格:

-spec par(boolean(),'f' | 'o') -> [40 | 41].
Run Code Online (Sandbox Code Playgroud)

我可以理解输入参数,因为这个函数没有被导出,我的代码只用一个布尔表达式作为第一个参数调用函数,而原子o或f作为第二个参数调用(例如par(4 > P, o)).

但为什么返回列表不包含空列表?我期待的东西像[40 | 41 | []][40 | 41 | ""]

此代码用于打印数学表达式,并在优先级或运算符足够时避免括号; 例如打印

3 + 4 + 5 * (6 + 7) - sin( x + 7) 而不是

3 + ( 4 + (( 5 * ( 6 + 7 )) - sin(( x + 7)))). …

erlang types

2
推荐指数
1
解决办法
67
查看次数

在使用rebar的版本中包含头文件(例如wx.hrl)的最佳方法是什么

我正在为使用rebar的应用程序准备一个版本,我想知道从标准库中包含头文件的常用方法是什么.在我的例子中,它是wx.hrl文件,它在我的代码中包含在其完整的绝对路径中.

我猜这不是正确的方法:o)

erlang wxwidgets rebar

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