Есть ли расширение Haskell, которое позволяет создавать более сложные конструкторы данных, затем GADT?Есть ли способ сделать больше «динамических» конструкторов данных в Haskell?
Предположим, что я хотел, чтобы создать структуру данных, которая представляет собой упорядоченный список, и есть конструктор данных, похожий на (:)
, которые работают со списками, с сигнатурой типа:
data MyOrdList a where
(>>>) :: (Ord a) -> a -> MyOrdList a -> MyOrdList a
Но я хочу (>>>)
иметь специфический поведение, что-то вроде этого:
(>>>) :: (Ord a) => a -> [a] -> [a]
x >>> [] = [x]
x >>> xs = low ++ [x] ++ high
where low = filter (<x) xs
high = filter (>x) xs
Таким образом, структура будет всегда упорядоченной структурой. (Я не сейчас, если это хорошая практика, я просто предлагаю самый простой пример, который вызвал меня по типу поведения, которое я хочу).
Конечно, я могу использовать функцию (>>>)
, но тогда у меня не будет соответствия шаблону и других преимуществ, которые у меня были бы у него. >>>
был конструктором данных.
Есть ли способ сделать что-то подобное?