On Fri, Aug 21, 2009 at 1:03 PM, Jason Dagit<da...@codersbase.com> wrote:
>
> Even with a type class for our type level numbers I'm at a loss.  I
> just don't understand how to convert an arbitrary int into an
> arbitrary but fixed type.  Perhaps someone else on the list knows.  I
> would like to know, if it's possible, how to do it.
>
> toPeano :: Nat n => Int -> n

The problem is that the parameter, n, is part of the input to toPeano,
but you need it to be part of the output. To rephrase slightly, you
have

    toPeano :: forall n. (Nat n) =>  Int -> n

but you need,

    toPeano :: Int -> exists n. (Nat n) => n

which states that toPeano determines the type of its return value. In
Haskell, you can encode this with an existential data type,

    data SomeNat where SomeNat :: (Nat n) => n -> SomeNat
    toPeano :: Int -> SomeNat

or, equivalently, by using a higher-order function.

    toPeano :: Int -> (forall n. Nat n => n -> t) -> t

-- 
Dave Menendez <d...@zednenem.com>
<http://www.eyrie.org/~zednenem/>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to