Если вы хотите сделать это так, чтобы не использовать встроенные функции (для обучения начинающих), вы можете разбить его на два этапа:
- Отрубить первый x элементов, рекурсивно вызывая вашу функцию и меняя аргументы соответствующим образом.
- Возвращает следующие y элементы, рекурсивно вызывая вашу функцию и изменяя аргументы соответствующим образом.
Ваш код будет выглядеть следующим образом:
dispRange :: …
dispRange … … … = []
dispRange … … … = dispRange … … …
⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮
dispRange … … … = dispRange … … …
Итак, вопросы:
- Какие типы аргументов и возвращаемое значение?
- Как выглядят входы базовых и рекурсивных случаев для первого этапа выше?
- Как выглядят входы базовых и рекурсивных случаев для второго этапа выше?
Теперь вы можете написать сигнатуру типа и шаблоны слева от знаков равенства (помните, что шаблоны выше имеют приоритет над шаблонами ниже, поэтому расположите их правильно).Затем вы можете написать реализацию каждого случая справа от знака равенства.
Если у вас возникли проблемы, другой способ - попытаться создать функцию, которая выполняет только первый этап.Затем попробуйте создать функцию, которая выполняет только второй этап.Затем используйте эти функции в вашей функции dispRange
.