Я настраиваю рекурсивную функцию, которая вызывает другую функцию для переноса значений из одной строки в другую. У меня все работает внутри функции left, но я с трудом понимаю синтаксис того, как рекурсивно вызывать функцию left.

Функция должна остановиться, когда обнаружит пробел (" ") в значении a.

left :: (String, String) -> (String, String) 
left (a, b) = (reverse(tail(reverse a)), ((head(reverse a))) :b)

reu' :: (String, String) -> (String, String)
reu' (a, b)
    | a ==  " " = (a, b)
    reu'(a, b) = left (a, b)

Ввод: "This is an ex""ample of a string"

Ожидается: "This is an""example of a string"

-1
Craig 30 Мар 2019 в 16:06

1 ответ

Лучший ответ

Поскольку вам нужно проанализировать конец a, рекурсия станет немного сложной. Я мог бы использовать предопределенные функции init и last, чтобы упростить эту задачу, и работать со словами, а не с отдельными символами. Обратите внимание, это заменит необходимость в left.

reu' (String, String) -> (String, String)
reu' a b = let w = words a  -- ["This", "is", "an", "ex"]
               a' = init w  -- ["This", "is", "an']
           in (unwords a', last w : b)

Если вы хотите выполнить рекурсию самостоятельно, проще отменить a один раз и переместить символы из начала этой строки в начало {{X1 }}, а затем переверните то, что осталось, как только найдете место.

reu' (String, String) -> (String, String)
reu' a b = reu'' (reverse a) b  -- reu'' "xe si na sihT" "ample of a string"
     where reu'' "" ys = ("", ys)
           reu'' (' ':xs) ys = (reverse xs, ys)
           reu'' (x:xs) ys = reu'' xs (x:ys)
0
chepner 30 Мар 2019 в 13:42