没有功能条款,虽然肯定有吗?

时间:2016-11-20 13:12:53

标签: elixir

我很感激这方面的一些帮助,这是我第一次尝试用Elixir做它而且它让我失望。

所以我的目的是一遍又一遍地从STDIN中捕获,将用户输入解析为数字。当用户最终点击输入而不输入数字时,他们将获得到目前为止输入的所有数字的总和。简单。

所以这就是我的计划方式:

defmodule Solution do
  def main, do: scan(IO.read :line)
  def scan(line), do: scan(IO.read :line, Integer.parse line)
  def scan("\n", total), do: IO.puts(total)
  def scan(line, {total, _}) do
    final_total = Integer.parse(line) + Integer.parse(total)
    next_line = IO.read :line
    scan(next_line, final_total)
  end
end

Solution.main

逐行:

def main, do: scan(IO.read :line)

首先,从stdin调用scan一行。

def scan(line), do: scan(IO.read :line, Integer.parse line)

如果我们使用单个参数进行scan调用,则将该参数解析为整数,并将其与下一个stdin行传递给scan/2

def scan("\n", total), do: IO.puts(total)

如果我们在stdin行为空的情况下进行scan/2调用,则只输出第二个参数,即整数total

然后最后

  def scan(line, {total, _}) do
    final_total = Integer.parse(line) + Integer.parse(total)
    next_line = IO.read :line
    scan(next_line, final_total)
  end

我们从stdin得到一行,一个整数和一些垃圾的元组。当前总数是该行(解析为int)加上之前的总数。我们再次使用stdin的新行和我们最新的总数调用scan/2

所有的逻辑似乎都适合我。但我得到(FunctionClauseError) no function clause matching in IO.read/2。 Elixir的错误消息不是超级描述性的,所以我无法解决这个问题。我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

这里最大的提示是2中的(FunctionClauseError) no function clause matching in IO.read/2。您正在调用IO.read的2个版本而不是1(带有参数:lineInteger.parse line),这是您最有可能的。这是因为您在第3行的IO.read参数周围缺少一对括号:

def scan(line), do: scan(IO.read :line, Integer.parse line)

应该是:

def scan(line), do: scan(IO.read(:line), Integer.parse line)

当你对它们进行嵌套时,在所有函数调用(至少是带有参数的函数)周围都有括号,这也被认为是更惯用的:

def scan(line), do: scan(IO.read(:line), Integer.parse(line))

由于Solution.scanIO.read都有1个和2个arity版本,因此这里的错误不太明显(比如编译失败)。