Подсписок первых N элементов

Подсписок первых n элементов, начиная с нулевого. Число n передает- ся первым аргументом, исходныи̮ список — вторым. У пустого списка при любом числе возвращается пустой список. Предусмотреть ситуацию с числом элементов, меньшим, чем значение n. Решить ее любым разумным способом. Список может быть потенциально бесконечным. сама функция у меня получилась, но я никак не могу вклинить туда условие, что будет если n больше числа элементов в списке. Штука еще и в том, что функции свертки использовать нельзя. Как исправить это условие?

length' :: [a] -> Int
length' [] = 0
length' (x:xs) = length' xs + 1 
take' :: Int -> [a] -> [a]
take' n _ | n <= 0 = []
          | (n > (length' xs)) = error "error!!!"
take' _ [] =  []
take' n (x:xs) =  x : take' (n-1) xs

Ответы (1 шт):

Автор решения: extrn

Если вам действительно так нужно завершить выполнение с ошибкой при неполном списке, но не при изначально пустом, перенесите рекурсию во вспомогательную функцию

take' :: Int -> [a] -> [a]
take' n _ | n <= 0 = []
take' _ [] =  []
take' n xs = go n xs
  where
    go 0 _ = []
    go n (x:xs) = x : go (n-1) xs
    go _ _ = error "error"
→ Ссылка