Я хотел бы использовать базовая функция больше, чем многие люди, например, повторно использовать takeWhile
интеллектуальным способом получения желаемого результата. Например, вы можете создать новый список предикатов с первым элементом является True
и takeWhile
этот список верно:
takeWhileP1 p xs = map snd (takeWhile fst (zip (True:map p xs) xs)
Это обобщает хорошо, как хорошо (не обязательно эффективны в таком виде):
takeWhilePlusN n p xs = map snd (takeWhile fst (zip (replicate n True ++ map p xs) xs))
Или, возможно, легче читать:
takeWhilePlusN n p xs =
let preds = replicate n True ++ map p xs
annotated = zip preds xs
in map snd (takeWhile fst annotated)
И результат:
*Main> takeWhilePlusN 3 (<5) [1..10]
[1,2,3,4,5,6,7]
*Main> takeWhilePlusN 1 (<5) [1..10]
[1,2,3,4,5]
*Main> takeWhileP1 (<5) [1..10]
[1,2,3,4,5]
*Main> takeWhile (<5) [1..10]
[1,2,3,4]
Вы считаете, что это «складка»? Используя шаблон 'foldr step base', вы можете написать любую функцию, подобную этой в списках. –
В случае, если из ответа Чи не ясно, что 'takeWhile' и другие' base' функции не являются магии: они реализованы в haskell, и вы можете просмотреть исходный код, скопировать-вставить и изменить их и т. Д. Большинство из них - однострочные. – jberryman