как печатать одинаковые символы подряд в haskell

#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 довольно явно просит пользователей публиковать ошибки и ожидания в коде, и пользователи стали беспокойными, когда этого не произошло.