Generic Sorting

4 messages
Open this post in threaded view
|

Generic Sorting

 Good evening Haskellers. I've done some searching but so far haven't found anything, which make me think this probably isn't possible.  I am wondering if it is possible to do a "Generic Sort" on multilevel data structures. Suppose you have something like: data A = A Int [Int] data B = B Int [A] a1 = A 2 [2,1] a2 = A 1 [4,3] b  = B 1 [a1,a2] genericSort b = B 1 [A 1 [3,4], A 2 [1,2]] note that not only are the A's sorted, but the list inside each A is sorted.  It "sorted all the way down".  Has Edward written such a thing yet? ;-) His "discrimination" library doesn't do this, in case you're wondering.  Any ideas? Best wishes, Henry Laxen _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafeOnly members subscribed via the mailman list are allowed to post.
Open this post in threaded view
|

Re: Generic Sorting

 November 14, 2020 2:08 PM, "Henry Laxen" <[hidden email]> wrote: > I've done some searching but so far haven't found anything, which make > me think this probably isn't possible. I am wondering if it is > possible to do a "Generic Sort" on multilevel data structures. > Suppose you have something like: This is not quite what you asked for, but might get you started. It's based on a trick that Alex Mason once showed me: {-# LANGUAGE AllowAmbiguousTypes  #-} {-# LANGUAGE DeriveDataTypeable  #-} {-# LANGUAGE ScopedTypeVariables #-} import Control.Lens import Data.Data import Data.Data.Lens import Data.List data A = A Int [Int] deriving (Data, Show) data B = B Int [A] deriving (Data, Show) a1 = A 2 [2,1] a2 = A 1 [4,3] b  = B 1 [a1,a2] -- | oh no -- >>> genericSort @Int b -- B 1 [A 1 [1,2],A 2 [3,4]] genericSort :: forall a d . (Data d, Typeable a, Ord a) => d -> d genericSort = partsOf template %~ (sort :: [a] -> [a]) Note that it's sorted every Int anywhere in the structure, not just the ones inside an A. HTH, -- Jack _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafeOnly members subscribed via the mailman list are allowed to post.