Как сгенерировать бесконечный список в Haskell на основе двух входных данных?

Мне нужно создать бесконечный список на основе двух входных данных.

gen :: Int -> Int -> [Int]
gen x y

Каждый элемент должен быть (x * y), и x увеличивается на y на каждой итерации, и исходный x также должен быть в списке. Так

gen 2 4

приведет к

[2,8,24,40,..]

Все мои попытки заканчиваются вечностью (я использую вызов «взять 4 (gen 2 4)» в ghci), поэтому я не уверен, как действовать дальше. Бесконечные списки просто доставляют мне много хлопот. Я пытаюсь сделать это с помощью нотации и монады списка. Любая помощь в правильном направлении будет высоко оценена.

РЕДАКТИРОВАТЬ

Это была моя последняя попытка, которая не сработала. Я изучаю Haskell через своего друга, и он дал мне эту задачу, чтобы научиться делать нотацию для монады списка.

gen :: Int -> Int -> [Int]
gen x y = 
 do 
  a <- [x..]
  guard $ mod a (x*y) == 0
  let x = x+y
  return a

person SmackMore    schedule 06.04.2017    source источник
comment
Покажите нам свои попытки!   -  person Daniel Wagner    schedule 06.04.2017
comment
По какой причине вы используете do-нотацию? Это требуется?   -  person stholzm    schedule 06.04.2017


Ответы (2)


Я думаю, вы могли бы создать понимание списка.

ghci> [2]++[(4*i+2)*4|i<-[0..]]

Вы можете использовать это в своей функции. Вы можете изменить переменную x вместо цифры «2» и свою «y» вместо цифры «4». Попробуй.

Наконец, я сделал конкатенацию (++) между пониманием списка и списком с [2] (переменная x).

person Alex    schedule 06.04.2017
comment
Развертывание понимания списка и замена ([x] ++) на (x :): gen x y = x : fmap (\ n -> (x + n * y) * y) [0..] - person gallais; 06.04.2017

gen :: Int -> Int -> [Int]
gen x y = x : l
  where l = fmap (\m -> y * (2 + m * y)) [0..]

тестирование:

take 5 $ gen 2 4 [2,8,24,40,56]

person fycth    schedule 06.04.2017