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