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.)