Я хочу определить функцию 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