
On Wednesday 18 July 2007, Johan Tibell wrote:
It would be nice if it was possible to capture this kind of behavior in a high order function just like map though. I guess the problem is that the function to map will take different number of arguments depending on the use case.
lookAtTwo a b = ...
lookAtThree a b c = ...
map' :: (a -> ... -> b) -> [a] -> [b]
The parameter take a variable number of parameters.
Note: I don't know if there is a sensible way to write map' at all. Perhaps explicit recursion is better in this case.
Variable number of parameters? data Mapper alpha beta = Yield beta | Consume (alpha -> Mapper alpha beta) genMap :: Mapper alpha beta -> [alpha] -> [beta] genMap m = flip fix m $ \ loop m' xn -> case (m', xn) of (Yield y, xn) -> y : loop m xn (Consume f, []) -> [] (Consume f, x : xn) -> loop (f x) xn Discards the last few elements of the list if there aren't enough, but you can say genMap (Consume $ \ x -> Consume $ \ y -> Yield $ f x y) xn if you want, and you can even get true C-style varargs out of this. A little verbose, but non-obvious techniques often are. Jonathan Cast http://sourceforge.net/projects/fid-core http://sourceforge.net/projects/fid-emacs