Я сделал следующий код:
formateaAux2::[String] -> [String]
formateaAux2 xs = map (++ " ") xs
formateaAux1::[String] -> Int -> [String]
formateaAux1 xs n
|n > 0 = do
x <- (formateaAux2(take n xs)) ++ (drop (length(xs) - n) xs)
formateaAux1 x (n - length(xs)) -- where it errors
|n <= 0 = []
formateaAux1 [] _ = []
Назначение этих функций следующее:
" "
к каждому элементу в нем. (работает нормально)Представьте, что список строк — это ["Hello", "World"] и n равно 4, целью будет получение на выходе ["Hello", "World"] с двумя пробелами после каждого слова. Если бы n было равно 3, то только после «Hello» было бы два пробела, а после «World» — только один.
Пока все хорошо, но я получаю следующую ошибку типа, говорящую мне, что в formateaAux1 x (n - length(xs))
код ожидает, что x будет иметь тип [String], но он получает только String. Однако x должен иметь тип [String], так как я объединяю список, составленный из formateaAux2
(который возвращает [String]) и функцию более высокого порядка drop
, верно?
Занимался этим какое-то время, и я больше не знаю, куда смотреть (хотя, вероятно, это что-то тривиальное), любая помощь приветствуется!
@bradrn Да, это ожидаемый результат
Используйте let x = ... in ...
, а не do x <- ...
— здесь вы не работаете с монадами. В вашем коде x <- list
означает «взять любой элемент list
» вместо «взять весь список».
@chi Понял, забыл об этом. Спасибо!
Благодаря тому, что @chi сказал:
formateaAux2::[String] -> [String]
formateaAux2 xs = map (++ " ") xs
formateaAux1::[String] -> Int -> [String]
formateaAux1 xs n
|n > 0 = let x = (formateaAux2(take n xs)) ++ (drop n xs) in
formateaAux1 x (n - length(xs))
|n <= 0 = xs
formateaAux1 [] _ = []
Что ты хочешь за
formateaAux1 ["a","b","c","d","e"] 17
? Я предполагаю, что вы хотели бы, чтобы результат был["a ","b ","c ","d ","e "]
, но некоторое подтверждение было бы неплохо.