Чтобы замедлить проверку правильности ввода

#haskell

#хаскелл

Вопрос:

 drop1 n xs | nlt;0 = error "Use positive numbers" drop1 _ [] = error "Empty list"  drop1 0 xs = xs drop1 n xs = drop1 (n-1)(tail1 xs)  

Моя функция drop1 проверяет каждый раз. Что я могу сделать, чтобы проверить это только 1 раз в первый раз? Как я могу изменить эту часть: drop1 n xs | nlt;0 = error "Use positive numbers" ?

Ответ №1:

Вы можете работать с вспомогательной функцией:

 drop1 :: Int -gt; [a] -gt; [a] drop1 n  | n lt; 0 = error "Use positive numbers"  | otherwise = go n  where go _ [] = error "Empty list"  go 0 xs = xs  go k (_:xs) = go (k-1) xs 

Таким drop1 образом , один раз проверяется, меньше ли значение 0 , тогда go как проверяется только 0 значение и значения больше 0 .

Вероятно , вы хотите поменять местами два предложения о go _ [] = error "Empty list" и go 0 xs = xs , поскольку удаление двух элементов списка, содержащего два элемента, вероятно, должно возвращать пустой список, а не ошибку.