Пронумеруйте каждый элемент списка и отформатируйте текст в haskell - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу дать каждому число от 1 до длины (x: xs), например, номер страницы книги.К сожалению, это работает только в обратном направлении.

numberL :: [String] -> [String]
numberL [] = []
numberL (x:xs) = ([show (length(x:xs)) ++ ": " ++ x] ++ numberL (xs))

Также, как мне удалить любую новую строку и табуляцию из текста и заменить ее фактической новой строкой и табулятором?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Чтобы понять это правильно, важно понять, почему вы думаете неправильно.Ваша рекурсия выглядит следующим образом:

numberL (x:xs) = ... ++ numberL xs

Таким образом, вы вычисляете numberL xs и затем помещаете что-то перед ним.Если бы numberL xs было правильно, то оно было бы пронумеровано от 1 и далее, как: 1:..., 2:..., 3:....Таким образом, вы никогда не сможете собрать numberL (x:xs) из numberL xs, просто добавив новые элементы спереди.Вся нумерация была бы неправильной.Вместо этого вам придется изменить всю нумерацию numberL xs.

Поэтому проблема в том, что не очень полезно знать numberL xs для вычисления numberL (x:xs), потому что numberL всегда начинает нумерацию с 1.

Так что поднимитеограничение.Создайте функцию, которая нумерует, начиная с n,

numberLFrom :: Int -> [String] -> [String]
numberLFrom n []     = ...
numberLFrom n (x:xs) = ...

Теперь вам нужно задать себе вопрос: чтобы набрать (x:xs), начиная с n, нужно набрать xs, начиная спод каким номером?И как тогда вы ввели цифру x в этот результат?

0 голосов
/ 23 ноября 2018

В Prelude есть несколько встроенных функций Haskell, которые удобны для изучения и использования.zip и zipWith - это два из них, когда вы думаете о том, что нужно сделать, используя два разных списка в одном списке результатов:

[1..] создаст список индексов для вас, это бесконечноlist

appendIndex :: String -> Int -> String
appendIndex s i = (show i) ++ " :" ++ s

indexThem :: [String] -> [String] 
indexThem l = zipWith appendIndex l [1..]

, если вы хотите использовать zip, что является более простым, но немного более подробным:

appendIndex :: (String,Int) -> String
appendIndex (s,i) = (show i) ++ " :" ++ s

indexThem :: [String] -> [String] 
indexThem l = fmap appendIndex $ zip l [1..]  
-- if you dont know about Functors yet, `fmap` is the generic way of doing `map` 
...