List function suggestions: Difference between revisions
RossPaterson (talk | contribs) m (Prelude function suggestions moved to List function suggestions) |
RossPaterson (talk | contribs) (clean up, to make room for more) |
||
Line 1: | Line 1: | ||
This page lists proposed extensions to the Haskell list functions, whether in the [http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Prelude] or [http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-List.html Data.List]. | |||
Please discuss the proposals on the Talk Page or the libraries list, and use this page to record the results of discussions. | |||
== Splitting on a separator, etc == | |||
We need these useful functions in Data.List; I'll call them 'split' (and variants) and 'replace'. These are easily implemented but everyone always reinvents them. Various versions have been proposed, but there was no consensus on which was best, e.g. | |||
* [http://www.haskell.org/pipermail/haskell-cafe/2006-July/thread.html#16559 haskell-cafe thread July 2006] | |||
* [http://www.haskell.org/pipermail/libraries/2004-July/thread.html#2342 libraries thread July 2004] | |||
Note: a lot of good points (diverging opinions!) are covered in the mailing lists, but if we include all these various cases, split* will have 9 variants! The goal is to reach some kind of reasonable consensus, specifically on naming and semantics. Even if we need pairs of functions to satisfy various usage and algebraic needs. Failing to accommodate every possible use of these functions should not be a sufficient reason to abandon the whole project. | |||
of | |||
The goal is clarity/uniformity (everyone uses them widely and recognizes them) and portability (I don't have to keep reimplementing these or copying that one file UsefulMissingFunctions.hs). | |||
The goal is | |||
Note: I (Jared Updike) am working with the belief that efficiency should not be a valid argument to bar these otherwise universally useful functions from the libraries; regexes are overkill for 'split' and 'replace' for common simple situations. Let's assume people will know (or learn) when they need heavier machinery (regexes, FPS/ByteString) and will use it when efficiency is important. We can try to facilitate this by reusing any names from FastPackedString and/or ByteString, etc. | Note: I (Jared Updike) am working with the belief that efficiency should not be a valid argument to bar these otherwise universally useful functions from the libraries; regexes are overkill for 'split' and 'replace' for common simple situations. Let's assume people will know (or learn) when they need heavier machinery (regexes, FPS/ByteString) and will use it when efficiency is important. We can try to facilitate this by reusing any names from FastPackedString and/or ByteString, etc. | ||
=== split (working name) === | === split (working name) === | ||
Line 74: | Line 55: | ||
["Hello", "there", "Haskellers!"] | ["Hello", "there", "Haskellers!"] | ||
</haskell> | </haskell> | ||
'''TODO: add version like python with multi-element separator''' | '''TODO: add version like python with multi-element separator''' | ||
Line 116: | Line 93: | ||
'''TODO: list names and reasons for/against''' | '''TODO: list names and reasons for/against''' | ||
[[Category:Proposals]] | [[Category:Proposals]] |
Revision as of 08:57, 6 September 2007
This page lists proposed extensions to the Haskell list functions, whether in the Prelude or Data.List. Please discuss the proposals on the Talk Page or the libraries list, and use this page to record the results of discussions.
Splitting on a separator, etc
We need these useful functions in Data.List; I'll call them 'split' (and variants) and 'replace'. These are easily implemented but everyone always reinvents them. Various versions have been proposed, but there was no consensus on which was best, e.g.
* haskell-cafe thread July 2006 * libraries thread July 2004
Note: a lot of good points (diverging opinions!) are covered in the mailing lists, but if we include all these various cases, split* will have 9 variants! The goal is to reach some kind of reasonable consensus, specifically on naming and semantics. Even if we need pairs of functions to satisfy various usage and algebraic needs. Failing to accommodate every possible use of these functions should not be a sufficient reason to abandon the whole project.
The goal is clarity/uniformity (everyone uses them widely and recognizes them) and portability (I don't have to keep reimplementing these or copying that one file UsefulMissingFunctions.hs).
Note: I (Jared Updike) am working with the belief that efficiency should not be a valid argument to bar these otherwise universally useful functions from the libraries; regexes are overkill for 'split' and 'replace' for common simple situations. Let's assume people will know (or learn) when they need heavier machinery (regexes, FPS/ByteString) and will use it when efficiency is important. We can try to facilitate this by reusing any names from FastPackedString and/or ByteString, etc.
split (working name)
We need a few of these:
split :: Eq a => a -> [a] -> [[a]]
splitWith :: (a -> Bool) -> [a] -> [[a]]
tokens :: (a -> Bool) -> [a] -> [[a]]
That preserve:
join sep . split sep = id
See below for 'join'
And some that use above split but filter to remove empty elements (but do not preserve above property). Easy enough:
split' :: Eq a => a -> [a] -> [[a]]
splitWith' :: (a -> Bool) -> [a] -> [[a]]
tokens' :: (a -> Bool) -> [a] -> [[a]]
i.e.
split' sep = filter (not . null) . split sep
Usage would be:
tokensws = tokens' (`elem` " \f\v\t\n\r\b")
tokensws "Hello there\n \n Haskellers! " ==
["Hello", "there", "Haskellers!"]
TODO: add version like python with multi-element separator
TODO: give code, copy-paste from threads mentioned above
TODO: list names and reasons for/against
replace (working name)
replace :: [a] -> [a] -> [a] -> [a]
like Python replace:
replace "the" "a" "the quick brown fox jumped over the lazy black dog"
===>
"a quick brown fox jumped over a lazy black dog"
TODO: give code, copy-paste from threads mentioned above
TODO: list names and reasons for/against
join (working name)
join :: [a] -> [[a]] -> [a]
join sep = concat . intersperse sep
TODO: copy-paste things from threads mentioned above
TODO: list names and reasons for/against