我感兴趣地阅读在线书" 学习你一些二郎 ",并尝试一些练习来检查我的理解.
我对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;
Run Code Online (Sandbox Code Playgroud)(typed_nonempty_fifo(_)) -> false.空({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).==>异常错误:错误的参数
Run Code Online (Sandbox Code Playgroud)in function length/1 called as length([1,2|3])
谢谢
当我在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中做同样的事情时,它工作得很好.
谁能让我知道可能出错的地方?
是否可以在跟踪中返回堆栈跟踪?我正在使用: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 不同的工具。
找到总和 = 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 个数字,则构建的列表理解甚至需要更长的时间。如果我要使用列表理解来解决这个问题,我做得对吗?如果是,为什么需要太长时间?请提供一个可能更快的解决方案,也许使用循环。
我正在学习 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)
它有效,但我不明白我必须添加此导入的原因。
我决定在我的一些代码中添加类型定义,然后我运行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)))). …
我正在为使用rebar的应用程序准备一个版本,我想知道从标准库中包含头文件的常用方法是什么.在我的例子中,它是wx.hrl文件,它在我的代码中包含在其完整的绝对路径中.
我猜这不是正确的方法:o)