Есть ли расширение Haskell, позволяющее создавать более сложные конструкторы данных, чем GADT?
Предположим, я хотел создать структуру данных, которая представляет собой упорядоченный список, и иметь конструктор данных, аналогичный (:)
, который работает со списками с сигнатурой типа:
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
Таким образом, структура всегда будет упорядоченной структурой. (Не знаю, если это хорошая практика, я просто предлагаю самый простой пример того поведения, которое я хочу).
Конечно, я могу использовать функцию (>>>)
, но тогда у меня не будет сопоставления с образцом и других преимуществ, которые у меня были бы >>>
был конструктором данных.
Есть ли способ сделать что-то подобное?