Haskell - отрицательные четные числа в бесконечном потоке

Я пытаюсь создать список бесконечных чисел

0,1,-2,3,-4,5,-6...

Пока я получил

evenise x   | x == 0 = 0
            | even x = -x
            | otherwise = x

s = foldl (\x -> evenise x) 0 [1..]

Однако я получаю ошибку

Occurs check: cannot construct the infinite type: a0 = b0 -> a0
In the first argument of `evenise', namely `x'
In the expression: evenise x
In the first argument of `foldl', namely `(\ x -> evenise x)'

Я не понимаю ошибку, так как evenise принимает элемент и аномальную функцию (\x -> evenise x) также принимает в единственном элементе.

3 ответа

Решение

Вы хотите использовать map не foldl

s = map evenise [0..]

map просматривает список и применяет сопоставленную функцию к каждому элементу. foldl используется для "сокращения" списка до значения - например, добавление всех элементов в списке может быть сделано как

foldl (+) 0

также, foldl работает только в конечных списках, в то время как foldr (также для сокращения) иногда будет работать с бесконечными списками.

Вы также можете создать бесконечный список и встроить тест в определение списка:

s = [ if odd x then x else negate x | x <- [0,1..] ]

Вы получаете ошибку, потому что foldl принимает функцию двух аргументов, а не одного. Но foldl В любом случае, я не могу обрабатывать бесконечные списки, поэтому я не понимаю, что вы там пытаетесь сделать.

(Вам не нужна первая строка в evenise потому что -0 == 0.)

Другие вопросы по тегам