Я столкнулся с ошибкой компилятора в elixir, как я могу устранить приведенную ниже ошибку?

#elixir

Вопрос:

для проблемы последовательности «посмотри и скажи» я столкнулся со следующей проблемой.!

 defmodule :look_And_say do
  def next_number(s,i) when i < String.length(s) do
    count = 1
    compare(s,i,count)
    next_number(s,i 1)
  end
  def next_number(s,i) do
   IO.puts("endd")
  end
  def compare(s,i,count) when i 1 < String.length(s) and s[i] == s[i 1] do
    compare(s,i 1,count 1)
  end
  def compare(s,i,count) do
    IO.puts str(count) <> s[i]
  end
end

IO.puts :look_And_say.next_number("11",0)
 

(Ошибка компиляции) look_and_say_sequence.exs:2: не удается вызвать удаленную функцию String.length/1 внутри guard
(stdlib) списки.erl:1354: :списки.mapfoldl/3
(stdlib) списки.erl:1355: :списки.mapfoldl/3

Комментарии:

1. Пожалуйста, опубликуйте свой код в виде текста, а не изображения.

2. Я отредактировал это, чтобы использовать текст.

Ответ №1:

Как говорится в ошибке, в guards нельзя вызывать произвольные функции. В охранниках может использоваться только ограниченное подмножество функций. Кроме того, вы не можете применять Access к строкам ( [] не будет работать со строками), используйте String.at/2 вместо этого.

Вам просто нужно применить свое условие в коде вашей функции

 def compare(s, i, count) do
  if i   1 < String.length(s) and String.at(s, i) == String.at(s, i   1) do
    compare(s, i   1, count   1)
  else
    IO.inspect({s, i, count}, label: "At the end")
  end
end