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