Hi,
every now and then I have an aha!-moment recognising how beautiful it  
can be to combine non-determinism with higher-order list functions.  
One of these moments was when I recognised that permuting a list means  
folding it with the insert operation - i.e., inserting every element  
recursively at an arbitrary position:
   permute = foldr1 insert
     where insert x (xs++ys) = xs++x:ys
For those who consider |foldr1| a way too suspicious function, here is  
another example: computing a sublist non-deterministically is  
*filtering* it with a predicate that yields either True or False [1]:
   sublist = filter (\_ -> True?False)
The filter function is probably much more tangible than foldr1 and  
this definition of sublist has a very declarative reading: for each  
element in the list do or do not keep it non-deterministically.
I'd like to see more of those, so if you have other examples, please  
share!
Cheers,
Sebastian
[1] inspired by: 
http://www.haskell.org/pipermail/haskell-cafe/2009-July/064337.html
-- 
Underestimating the novelty of the future is a time-honored tradition.
(D.G.)
_______________________________________________
curry mailing list
curry_at_lists.RWTH-Aachen.DE
http://MailMan.RWTH-Aachen.DE/mailman/listinfo/curry
Received on Mo Jul 20 2009 - 09:50:07 CEST