То, к чему вы стремитесь, 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>