Hi,

On Sun, Aug 10, 2008 at 8:57 PM, Michael Feathers
<[EMAIL PROTECTED]> wrote:
> 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 :-)
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to