как сделать длину элементов списка такой же, как у самого длинного в haskell

#haskell #functional-programming

#haskell #функциональное программирование

Вопрос:

например: makeSame ["ab", "bad", "mammy"] тогда вывод ["ab***","bad**", "mammy"] для каждого пропущенного символа получаем '*'

 makeSame:: [String] -> [String]
makeSame m = let f = length  (last (sort m))
  in 
    (x ->replicate length x x   '*') m
  

но даже не компилируется.

Комментарии:

1. Какую ошибку компиляции это выдает?

2. Как вы думаете, replicate length x x что делать? И почему вы так думаете?

3. Ваш расчет максимальной длины неверен (попробуйте ["aa", "b"] указать 1 вместо 2 ).

4. я пытаюсь еще раз, свяжусь, как только я это сделал @talex

5. @talex спасибо за ваш вклад!, я поделился своим решением

Ответ №1:

вот решение с вспомогательной функцией от @talex

 longest :: [String] -> Int
longest m = maximum $ map length m

makeSame :: [String] -> [String]
makeSame m = map ( x -> x    replicate (longest m- length x) '*') m 
  

Ответ №2:

Чтобы получить максимальную длину, вы можете:

 maxLength list = maximum $ map length list
  

для дублирования символов используйте replicate ( replicate 3 '*' приведенный "***" пример).

Все, что вам нужно сделать, это объединить эти два метода.

Чтобы определить количество пропущенных символов, вам нужно вычесть длину строки ( length "somestring" указать ее вам) из максимальной длины.

Комментарии:

1. чтобы получить максимальное количество элементов списка, я тоже это сделал, но проблема в том, как определить количество пропущенных символов, а затем добавить его

2. @mWelt Я расширил свой ответ.