Как мне создать функцию printRow в Haskell?

#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 = "" и посмотрите, соответствует ли результат тому, что вы хотели, а если нет, то как это сделать. 🙂