#haskell #functional-programming
#хаскелл #функциональное программирование #haskell
Вопрос:
У меня есть следующая функция в Haskell:
printRow :: [(Int, String)] → String
Я хочу это, учитывая список пар (левый элемент
предоставление желаемой длины поля и нужного элемента его содержимому), для форматирования одной строки в таблице. Например,
printRow [ (5, "Alice"),(6, "Allen"),(6, "female"),(6, "82000")]
должен возвращать форматированную строку
"|Alice|Allen |female| 82000|"
Я знаю, что мне, вероятно, следует использовать функции intercalate
, map
и uncurry
, но я немного застрял, так как я не очень знаком с функциональным программированием. Я пробовал что-то вроде:
printRow (int, string) = if all isDigit string
-- all_digits should be right-aligned
then ...
else map intercalate "|" uncurry (int, string)
Как вы, вероятно, можете догадаться, это не сработает, и я не уверен, как это сделать.
Комментарии:
1. Начните с отделения
printRow
(которое принимает список) отprintCell
(которое принимает ширину и строку). Вам не обязательноuncurry
— писать функции с явными параметрами и сопоставлением с шаблоном будет проще.
Ответ №1:
Зная, как обрабатывать одну спецификацию форматирования,
printOne :: (Int, String) -> String
printOne (int, string) =
if all isDigit string
then a b "|"
else b a "|"
where
a = ....
b = ....
c = length string
мы можем превратить каждую спецификацию в списке в форматированную строку с map
и объединить результаты
printRow specs = a concat ( map printOne specs )
where
a = ....
Вы должны быть в состоянии завершить код. Чтобы повторно выводить символ пробела, используйте replicate :: Int -> a -> [a]
.
Комментарии:
1. Спасибо за ваш ответ, я выбрал a = replicate (int — c) » » и b = string для переменных printOne и не понял, что заполнять для a в printRow. Не могли бы вы, пожалуйста, помочь мне с этим? Спасибо!
2. попробуйте
a = ""
и посмотрите, соответствует ли результат тому, что вы хотели, а если нет, то как это сделать. 🙂