дать рекурсивное определение при показе «строковых» элементов - PullRequest
0 голосов
/ 30 мая 2011

У меня есть следующая функция:

convertToStr :: [Int] -> String
convertToStr [] = []
convertToStr (int:ints)
    | length (int:ints) == 1 = ((show (head (drop 0 (int:ints)))) ++ ", ")
    | length (int:ints) == 2 = ((show (head (drop 0 (int:ints)))) ++ ", ") ++ ((show (head (drop 1 (int:ints)))) ++ ", ")

Как видно выше, мне удалось получить следующий вывод из этого ввода:

> convertToStr [3,5]
"3, 5, "

Кажется, однако, я застрял в том, что касается возможности написать рекурсивное определение. Я хотел бы преобразовать список любой длины в [Int] элементах в строку с этим списком и не ограничивать его как таковой.

Ответы [ 2 ]

5 голосов
/ 30 мая 2011

Без явной рекурсии вы можете сделать это, используя map и вкрапления , как это

convertToString :: [Int] -> String
convertToString = concat . (intersperse ", ") . map show

Редактировать: И с ручной рекурсией это похоже на

cts [] = ""
cts (x:xs)
   | null xs = show x 
   | otherwise = show x ++ ", " ++ cts xs
0 голосов
/ 30 мая 2011

Прежде всего, ваша функция немного грязная. Я бы посоветовал вам взглянуть на некоторые библиотечные функции для вашей задачи. Я предлагаю intercalate, который берет список списков (строк), помещает что-то между ними (например, ", ") и объединяет их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...