On 18/07/07, apfelmus <[EMAIL PROTECTED]> wrote:

I like it for its elegant point-free style :)

Yes, well, I am rather enamoured of them! :-)

Apparently, difference can only detect character replacements but not
character insertion or deletion, but that's probably not your use case.

Yes, that is the case. If I allowed words differing in length they
would necessarily look different, so it would be less of a challenge.

I could still challenge people to identify the two words of course.
Any practice is good.

You can avoid generating the superfluous half of the pairs by using  tails

  listPairs ws = [ (head ws', w')
    | ws' <- tails ws, w' <- ws'
    , let w = head ws', length w == length w']

Of course, grouping words by length first and pairing the resulting
groups is more efficient than filtering out all the pairs where  length
w /= length w'. But you restrict  fingerspell  to a fixed word length
anyway, so it doesn't matter.

I realised after I sent that post that I had *aready* filtered the
words so they were all the same length. So the length condition in
that list comprehension was completely superfluous. Meh.

I will look at using tails to clean things up a bit. I tried to see if
there were redundant parts I could remove today, but I was stymied by
my lack of understanding of the list comprehensions.

I worked out that [ (a,b) | a <- as, b <- bs ] must be equivalent to

comp = concatMap (\x -> map ((,) x) ys) xs

but I can't really say how conditions like "a /= b" get slotted in to
that style. Is there a reference for that?

Cheers,

Dougal.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to