#haskell
#haskell
Вопрос:
когда я ввожу, например, gggiiss в качестве входных данных, вывод должен быть ggg.
round :: String -> String
round []=[]
round [x]=[x]
round (x:xs) = if xs == x then [x] xs round(xs)
else [x]
Приведенный выше код — это то, что я написал, но у меня много ошибок, которые я не понимаю. Кто-нибудь знает, как это исправить? Учитывая, что первая строка кода является обязательной
Комментарии:
1. пожалуйста, предоставьте дополнительную информацию и сообщения об ошибках
2.
xs
всегда будет список, поэтому он никогда не будет равенx
. Кроме того, если это не присваивание, для этого есть библиотечные функции, посмотритеtakeWhile
иgroup
3. Я исправил синтаксис markdown в вашем сообщении; однако я не был точно уверен, как исправить одну его часть. Пожалуйста, просмотрите мои правки и убедитесь, что расположение
else
в сообщении совпадает с тем, что вы указалиelse
в файле, который пытаетесь загрузить.
Ответ №1:
round :: String -> String
Вы говорите, что ваша функция принимает строку в качестве входных данных и выдает строку в качестве выходных данных. Это хорошо и согласуется с вашим примером round "gggiiss" == "ggg"
.
round [] = []
Ваш базовый вариант — это пустой список, ввод — это пустой вывод списка, звучит хорошо.
round [x] = [x]
Другой базовый вариант одного элемента. Итак, я полагаю, это означает, что в следующем случае потребуется два или более элементов, верно? …
round (x:xs) = ...
О нет, что здесь произошло? Вам требуется только один элемент ( xs
может быть []
). Вы, вероятно, хотели два элемента и остальную часть списка round (x1:x2:xs) ...
.
if xs == x
Ну, это не имеет смысла. Вы не можете сравнить список xs (например "ggiiss"
) с одним значением x (например 'g'
). Если вы использовали x1
и x2
, как я показал выше x1 == x2
, это имело бы смысл, поскольку это оба символа.
then [x] xs round(xs)
Что значит добавить две строки вместе xs round xs
? Более разумной стратегией, вероятно, является конкатенация then [x1] round (x2:xs)
. Я сохранил x2
so в рекурсивном случае, который вы бы сравнили для правильного символа.
else [x]
Вероятно, это проблема с копированием / вставкой, но это else
должно быть с отступом, насколько then
это возможно. Окончательный код:
rnd :: String -> String
rnd []=[]
rnd [x]=[x]
rnd (x1:x2:xs) = if x1 == x2 then [x1] rnd(x2:xs) else [x1]
PS Вы получаете отрицательные голоса по ряду причин. Я предполагаю, но главным из них является то, что вы не опубликовали полный текст «вот код», «это намерение», «вот как я вызываю код» и «вот ошибка». SO довольно явно просит пользователей публиковать ошибки и ожидания в коде, и пользователи стали беспокойными, когда этого не произошло.