
A continuation. You can't know, what type your "fromInt n" should be, but you're not going to just leave it anyway, you're gonna do some calculations with it, resulting in something of type r. So, your calculation is gonna be of type (forall n. Nat n => n -> r). So, if you imagine for a moment that "fromInt" is somehow implemented, what you're gonna do with it is something like calculate :: Int -> r calculate i = let n = fromInt i in k n where k is of type (forall n. Nat n => n -> r). Now we capture this pattern in a function: genericCalculate :: Int -> (forall n. Nat n => n -> r) -> r genericCalculate i k = let n = fromInt i in k n Going back to reality, fromInt can't be implemented, but genericCalculate probably can, since it doesn't involve calculating a type. 19.11.2010 10:25, Arnaud Bailly пишет:
Just after hitting the button send, it appeared to me that fromInt was not obvious at all, and probably impossible. Not sure I understand your answer though: What would be the second parameter (forall n . (Nat n) => n -> r) -> r) ?
Thanks Arnaud
On Fri, Nov 19, 2010 at 1:07 AM, Daniel Peebles
wrote: The best you can do with fromInt is something like Int -> (forall n. (Nat n) => n -> r) -> r, since the type isn't known at compile time.
On Thu, Nov 18, 2010 at 2:52 PM, Arnaud Bailly
wrote: Thanks a lot, that works perfectly fine! Did not know this one... BTW, I would be interested in the fromInt too.
Arnaud
On Thu, Nov 18, 2010 at 8:22 PM, Erik Hesselink
wrote: On Thu, Nov 18, 2010 at 20:17, Arnaud Bailly
wrote: Hello, I am trying to understand and use the Nat n type defined in the aforementioned article. Unfortunately, the given code does not compile properly: [snip]
instance (Nat n) => Nat (Succ n) where toInt _ = 1 + toInt (undefined :: n) [snip]
And here is the error:
Naturals.hs:16:18: Ambiguous type variable `n' in the constraint: `Nat n' arising from a use of `toInt' at Naturals.hs:16:18-39 Probable fix: add a type signature that fixes these type variable(s) You need to turn on the ScopedTypeVariables extension (using {-# LANGUAGE ScopedTypeVariables #-} at the top of your file, or -XScopedTypeVariables at the command line). Otherwise, the 'n' in the class declaration and in the function definition are different, and you want them to be the same 'n'.
Erik
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe