Я застрял, играя с "гетерогенным рекурсивным бесконечным типом" (какое-нибудь название получше?).
Пусть следующая рабочая "Глубокая сортировка"
class Ord f => DeepSort f where
deepSort :: f -> f
deepSort = id
instance DeepSort Int where
-- and so on ...
instance DeepSort a => DeepSort [a] where
deepSort = sort . map deepSort
instance DeepSort a => DeepSort (Maybe a) where
deepSort = fmap deepSort
-- and so on ...
Например
sample :: [Maybe [[Int]]]
sample = [ Just [[5, 3, 7, 1], [6, 0]]
, Nothing
, Just [[8, -1], []]
]
main = print $ deepSort sample
пишет
[Nothing,Just [[],[-1,8]],Just [[0,6],[1,3,5,7]]]
но теперь я хочу параметризовать критерии сортировки, например (не работает)
main = print $ deepSortBy sample
( By (compare `on` someCriteria1)
$ By (compare `on` someCriteria2)
$ By (compare `on` someCriteria3)
$ Then (compare `on` someCriteria4)
)
Моя проблема заключается в том, как определить аргумент "гетерогенный рекурсивный бесконечный тип" (или как его там еще назвать).
Я думаю, что это
By (f1 (f2 ... (fN a) ...)
(By (f2 ... (fN a) ...)
...
Then (fN a)
)
Примечание: в примере deepSort
вложенные контейнеры были отсортированы по возрастанию с экземпляром Ord
по умолчанию; смысл deepSortBy
заключается в предоставлении явных Ord
функций сравнения для каждого вложенного контейнера. Поскольку контейнеры f1 (f2 (f3 ... (fN a)...)
, критерии могут/должны быть указаны как By comparer1 (By comparer2 (By ...
. Но может быть лучше другой подход, конечно.
кроме того, вероятно, существует лучший "подход Haskell" НО я бы хотел (если возможно)
Существует какое-то прямое решение моего подхода "по классам"?
Какой лучший "подход Haskell" к такой проблеме?
Какая-то библиотека решает это?
Спасибо!!!
ОТРЕДАКТИРОВАНО
У меня есть возможный подход к решению (опубликуйте как решение, оно работает! :D)
sample
— это списокMaybe
; поэтому, когда вы (глубоко) сортируете, вам нужно сравнить этиMaybe
, но вы начинаете со сравнения поlength
. - person MigMit   schedule 08.10.2014deepSort
относится кData.List.sort
, какdeepSortBy
кData.List.sortBy
(но вместо этого используются только списки, обобщающие с использованиемclass
). Кроме того,deepSortBy
можно записать какmap deepSortBy . sortBy f
(с другим результатом), но это не главное. Я добавил примечание, разъясняющее это (я желаю). - person josejuan   schedule 08.10.2014By
иThen
? Если у вас возникли проблемы с определением их типов, вы должны хотя бы уметь определять типыsomeCriteria1
,someCriteria2
,someCriteria3
иsomeCriteria4
. - person Cirdec   schedule 08.10.2014newtype
для бесконечного типа), но он не работает... :'( - person josejuan   schedule 08.10.2014