Я хочу определить функцию replicate для репликации списка чисел по его значению, используя только понимание списка, например:
replicate [5,1,3,2,8,1,2]
output: [5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]
Я знаю, что было бы легко использовать встроенную функцию «реплицировать», но разрешено только понимание списка, как я могу это сделать?
БЛАГОДАРНОСТЬ!
1
Linda Cohen
6 Май 2010 в 02:37
Спасибо за совет, собирался добавить сейчас, но MtnViewMark меня опередил.
– Linda Cohen
6 Май 2010 в 06:24
2 ответа
Лучший ответ
Небольшая аккуратная проблема. Решил вот так.
replicate list = [ a | a <- list, _ <- [1..a]]
Prelude> replicate [5,1,3,2,8,1,2]
[5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]
Он берет каждое значение в списке, создает такое количество копий самого себя, а затем переходит к следующему значению.
9
2 revs
7 Май 2010 в 01:41
Это работает, но я понятия не имею, как. кажется, что 'b' не имеет ничего общего с 'a', но делает его множественными копиями. интересно, как это работает.
– Linda Cohen
6 Май 2010 в 04:45
2
Совет: вы можете читать простые понимания списков во многом как императивные циклы, которые накапливают значения в конце списка.
– a <- list
говорит "цикл по каждому элементу list
", а b <- [1..a]
- это цикл внутри этого цикла, говорящий "цикл с b
переходом от 1 к a
". a
в начале говорит о накоплении a
в конце списка каждый раз.
sigfpe
6 Май 2010 в 04:57
2
Я бы предложил использовать _ вместо b, чтобы прояснить, что на самом деле вас не волнует значение b.
– sepp2k
6 Май 2010 в 14:46
Чтобы добавить к user207442, если у нас есть список, который идет
– [x|exp]
, список будет содержать все x
, для которых exp истинно. Если exp
содержит несколько элементов (например, здесь, через запятую), используется перекрестное произведение . a <- list, b <- [1..a]
означает использование всех комбинаций a
(являющихся одним элементом list
) и b
. Поскольку b
вносит вклад с a
количеством элементов, мы получаем a
элементов, умноженных на a
.
Svend
7 Май 2010 в 01:56
Для ударов:
import Control.Monad
import Control.Monad.Instances
repList = concatMap $ join replicate
7
Thomas Eding
6 Май 2010 в 03:02
Похожие вопросы
Новые вопросы
haskell
Haskell — это чисто функциональный язык программирования со строгой статической типизацией, отложенными вычислениями, обширной поддержкой параллелизма и параллелизма, а также уникальными возможностями абстракции.