Я был бы признателен за помощь в этом, это первое, что я пытаюсь сделать с Эликсиром, и это сбивает меня с толку.
Итак, я намерен снова и снова считывать из STDIN, анализируя пользовательский ввод как числа. Когда пользователь, наконец, нажимает Enter, не вводя число, он получает сумму всех введенных чисел. Простой.
Итак, вот как я это планирую:
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)
Для начала вызовите scan
, передав одну строку из стандартного ввода.
def scan(line), do: scan(IO.read :line, Integer.parse line)
Если мы получаем вызов scan
с одним аргументом, анализируем этот аргумент как целое число и передаем его плюс следующую строку стандартного ввода в scan/2
.
def scan("\n", total), do: IO.puts(total)
Если мы получим вызов 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) плюс предыдущая сумма. Мы снова вызываем scan/2
с новой строкой из стандартного ввода и нашей последней суммой.
Вся логика кажется мне верной. Но я получаю (FunctionClauseError) no function clause matching in IO.read/2
. Сообщения об ошибках Эликсира не очень информативны, поэтому у меня возникли проблемы с этим. Что именно я делаю неправильно?