В функции я должен пронумеровать элементы списка, который должен возвращаться следующим образом: «n: остальная часть строки»
numberLines :: [String] -> [String]
["asd qwe", "-- Foo", "", "\thello world "]
-> ["1: asd qwe", "2: -- Foo", "3: ", "4: \thello world "]
Мне не разрешено использовать простую рекурсию, только функции более высокого порядка (при необходимости)
Мои проблемы:
"counter: " ++ "string"
не сработает)Вам не нужен счетчик, просто каждый индекс, который вам может понадобиться: [1..]
.
Экземпляра Show
для ваших индексов должно быть достаточно: show 1 == "1"
.
Вы можете работать с zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
, который будет одновременно перечислять два списка и создавать список элементов, где ci — это f ai bi для c = zipWith fab
. В качестве первого элемента вы можете, например, передать ему бесконечный список [1..]
, а в качестве второго — список строк, поэтому:
numberLines :: [String] -> [String]
numberLines = zipWith f [1..]
where f idx st = …
где вам еще нужно заполнить части …
.
Многие люди хотят, чтобы вы использовали zipWith
. Хотя это даст правильный ответ, он потребляет два списка и поэтому не полностью поддерживает слияние списков, которое может работать только с одним списком за раз. Вот альтернативное решение, которое может полностью слиться:
numberLines :: [String] -> [String]
numberLines xs = foldr (\st acc idx -> …:acc (idx+1)) mempty xs 1
Как и в ответе Виллема Ван Онсема, вам нужно будет заполнить часть …
самостоятельно.
Предложение: взгляните на функцию
zipWith