
On 18/07/07, apfelmus
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.