Я привык к более высоким функциям Haskell. Обычно я могу заменить явные шаблоны рекурсии такими функциями, как map, fold и scan. Однако я часто сталкиваюсь с следующей схемой рекурсии, которую я не понимаю, как выразить, используя функции более высокого порядка:
f (x:[]) = k x
f (x:xs) = g x (f xs)
Например, предположим, что я представляю аналитические таблицы. Затем я создаю тип данных, например:
data Tableau = N Expr | S Expr (Tableau) | B Expr (Tableau) (Tableau)
Если я хочу преобразовать список Expr
в структуру таблицы, мне нужна функция, часть которой может напоминать:
f (x:[]) = N x
f (x:xs) = S x (f xs)
Теперь я вижу три варианта: (1) создать функцию, которая решает, учитывая таблицу и список, должна ли следующая ветвь в таблице быть S
или N
(или B
, но мы проигнорируем этот случай); (2) использовать функцию более высокого порядка для инкапсуляции рекурсивного рисунка f
; (3) используйте функцию типа f
.
Каким будет лучший вариант?