2016-11-20 6 views
2

Буду признателен за помощь в этом, это первое, что я пытаюсь сделать с 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 не являются супер описательными, так что у меня возникли проблемы с этим. Что я делаю неправильно?

ответ

2

Самый большой совет: 2 в (FunctionClauseError) no function clause matching in IO.read/2. Вы вызываете версию 2 arity от IO.read вместо 1 (с аргументами :line и Integer.parse line), которые вы, скорее всего, планировали. Это потому, что вы пропустили пару круглых скобок вокруг аргументов для IO.read в 3-й строке:

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)) 

ошибка здесь немного менее очевидно, чем это могло бы быть (как failin г для компиляции), так как оба Solution.scan и IO.read имеют 1 и 2 версии arity.

+0

О, да, я полностью пропустил это, и это имеет полный смысл. Спасибо за это @Dogbert, оцените его. – GreenTriangle

Смежные вопросы