关于IO输入的Erlang badarith

时间:2015-10-13 17:09:46

标签: erlang

我正在学习Erlang,我正试图通过stdio输入的一些输入将消息从一个进程传递到另一个进程。

这是我的代码(我知道我可以使用普通函数,但这不是主题)。

-module(play).

-compile(export_all).

calculateArea() ->
  receive
    {rectangle, W, H,SenderPID} -> SenderPID ! {area,W * H};
    {circle, R,SenderPID} -> SenderPID ! {area,3.14 * R * R};
    _ -> io:format("We can only calculate area of rectangles or circles.")
  end,
  calculateArea().

doStuff() ->
  CalculateArea = spawn(play,calculateArea,[]),
  {ok,Width} = io:fread("Enter width","~d"),
  {ok,Height} = io:fread("Enter height","~d"),
  CalculateArea ! {rectangle,Width,Height,self()},
  receive
    {area,Size} -> io:write(Size)
  end,
  io:fwrite("done").

当我运行play:doStuff().时,我收到{badarith,[{play,calculateArea,0,[{file,"play.erl"},{line,10}]}]}错误。

我不明白为什么,根据文档,“〜d”会给我一个十进制值,如果我打印它肯定会是这样。

这里抓到了什么?

1 个答案:

答案 0 :(得分:4)

io:fread返回

Result = {ok, Terms :: [term()]}
       | {error, {fread, FreadError :: io_lib:fread_error()}}
       | server_no_data()

因此WidthHeight将是包含单个数字的列表。使用{ok, [Width/Height]} = ...进行修复。