Как создать список всех целых чисел в двух целых числах (минимальное и максимальное) в Haskell? - PullRequest
1 голос
/ 08 апреля 2020

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

Вот что у меня есть, но не повезло.

rangeList :: Integer -> Integer -> [Integer]
rangeList n m
 | n == m = []
 | otherwise = n : n + (rangeList n (m-1))

Ответы [ 2 ]

6 голосов
/ 08 апреля 2020

Ваша функция rangeList уже существует в Prelude под именем enumFromTo.

4 голосов
/ 08 апреля 2020

То, к чему вы стремитесь, sh уже существует. Если обе границы включены, это:

rangeList :: Enum a => a -> a -> [a]
rangeList n m = [n .. m]

или если верхняя граница является исключительной, вы можете использовать pred :: Enum a => a -> a:

rangeListExcl :: Enum a => a -> a -> [a]
rangeListExcl n m = [n .. pred m]

Основная проблема с вашей собственной реализацией заключается в том, что n + rangeList n (m-1) не имеет особого смысла, поскольку rangeList n (m-1) будет списком элементов, а n - здесь Integer, поэтому вы не можете добавить эти все вместе. Даже если бы вы могли сделать это, это все равно не сработало бы правильно, поскольку rangeList n (m-1) сделал бы последовательность между n и m-1, добавив n к этому результату, вы получите диапазон между 2*n и n+m-1. Рекурсия должна увеличивать верхнюю границу на единицу, например:

rangeListExl :: (Ord a, Num a) => a -> a -> [a]
rangeListExcl n m
    | n >= m = []
    | otherwise = n : <b>rangeListExcl (n+1) m</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...