#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