
Hi,
On Sun, Aug 10, 2008 at 8:57 PM, Michael Feathers
If I have, say, a function f :: a -> a -> a -> a -> b it would be nice to be able to just:
unlistN 4 f [1..4]
It indeed doesn't work like this; there's more than one way to do something *like* this, if you really want to. The closest one is probably to use type-level numbers: {-# OPTIONS_GHC -fglasgow-exts #-} data Zero data Suc a zero :: Zero; zero = undefined; suc :: a -> Suc a; suc = undefined one = suc zero; two = suc one; three = suc two; four = suc three class Unlist n a b where type UnlistFn n a b unlist :: n -> UnlistFn n a b -> [a] -> b instance Unlist Zero a b where type UnlistFn Zero a b = b unlist _ r _ = r instance Unlist n a b => Unlist (Suc n) a b where type UnlistFn (Suc n) a b = a -> UnlistFn n a b unlist _ f (x:xs) = unlist (undefined :: n) (f x) xs main = print (unlist four (,,,) "abcd") This prints ('a','b','c','d'). Hope this is fun[*], - Benja [*] I hesistate to say "hope this helps" in this case :-)