[Haskell-cafe] How to split this string.

Jon Fairbairn jon.fairbairn at cl.cam.ac.uk
Fri Jan 6 11:39:22 CET 2012


Steve Horne <sh006d3592 at blueyonder.co.uk> writes:

> On 05/01/2012 11:09, Brandon Allbery wrote:
>> On Thu, Jan 5, 2012 at 05:57, Steve Horne
>> <sh006d3592 at blueyonder.co.uk
>> <mailto:sh006d3592 at blueyonder.co.uk>> wrote:
>>
>>      --  groupCut - Similar to groupBy, but where groupBy assumes an
>>     equivalence relation,
>>      --  groupCut takes a function that indicates where to cut. The
>>     two parameters to this
>>      --  function are always adjacent items from the list, and if the
>>     function returns True,
>>      --  a cut is done between the two items.
>>
>> span/break?

> Using those, the test function won't always be passed two
> *adjacent* elements from the list. After all, they're based
> on takeWhile and dropWhile, which take unary functions,
> meaning an element has already been curried in (the starting
> element of the group).
>
> That's probably how the current groupBy is implemented - the
> approach that assumes an equivalence relation, giving
> unexpected results when the By function isn't an equivalence
> relation.

groupBy is currently implemented using span.

It strikes me that we ought to specify some properties for what
we want. Start by defining:

   pairwiseInOrderBy p l = all (uncurry p) (l `zip` drop 1 l)

giving

   all (pairwiseInOrderBy p) (groupCut p l)

and we would want

   concat (groupCut p l) == l

(all modulo nontermination side conditions). Anything else?

-- 
Jón Fairbairn                                 Jon.Fairbairn at cl.cam.ac.uk




More information about the Haskell-Cafe mailing list