[Haskell-cafe] Non polymorphic numerals option -- avoiding type classes
Kim-Ee Yeoh
ky3 at atamo.com
Thu Dec 27 23:43:36 CET 2012
On Thu, Dec 27, 2012 at 11:48 PM, Rustom Mody <rustompmody at gmail.com> wrote:
> On Thu, Dec 27, 2012 at 8:26 PM, Kim-Ee Yeoh <ky3 at atamo.com> wrote:
>> What he really wants methinks is a way to suppress type classes
altogether! That or a NoOverloadedNumerals extension.
>
> I'm not really sure about that... Look!
>
> Prelude> :t [[1,2],3]
> [[1,2],3] :: (Num [t], Num t) => [[t]]
As Satvik explained, well-typed does not imply instantiable. And with
constraints, not instantiable /does/ imply not evaluable!
> :set -XRebindableSyntax
> let fromInteger = id
> Prelude> :t [[1,2],3]
>
> Couldn't match expected type `[Integer]' with actual type `Integer'
> Expected type: Integer -> [Integer]
> Actual type: Integer -> Integer
> In the expression: 3
> In the expression: [[1, 2], 3]
You can see overloaded numerals at work again via the hidden hand of
fromInteger.
Presumably some imaginary NoOverloadedNumerals extension would thoroughly
purge its presence.
-- Kim-Ee
On Thu, Dec 27, 2012 at 11:48 PM, Rustom Mody <rustompmody at gmail.com> wrote:
>
> On Thu, Dec 27, 2012 at 8:26 PM, Kim-Ee Yeoh <ky3 at atamo.com> wrote:
>>
>> Hi David, it looks like Rustom's aware that haskell's not lisp. What he
really wants methinks is a way to suppress type classes altogether! That or
a NoOverloadedNumerals extension.
>>
>> -- Kim-Ee
>>
>
> I'm not really sure about that... Look!
>
> ghci with default startup
> --------------------
>
> $ ghci
> GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
> Loading package ghc-prim ... linking ... done.
> Loading package integer-gmp ... linking ... done.
> Loading package base ... linking ... done.
> Prelude> :t [[1,2],3]
> [[1,2],3] :: (Num [t], Num t) => [[t]]
>
> So it would appear that ghci is giving a well-typing for [[1,2], 3].
> But is it?
>
> Prelude> [[1,2],3]
>
> <interactive>:3:8:
>
> No instance for (Num [t0])
> arising from the literal `3'
>
> Possible fix: add an instance declaration for (Num [t0])
> In the expression: 3
> In the expression: [[1, 2], 3]
> In an equation for `it': it = [[1, 2], 3]
> -------------------
> So is it well-typed in ghci or not??
>
> And now we add Roman's suggestions...
> $ cat .ghci
>
> :set -XRebindableSyntax
> let fromInteger = id
>
> And run ghci again
>
>
> $ ghci
> GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
> Loading package ghc-prim ... linking ... done.
> Loading package integer-gmp ... linking ... done.
> Loading package base ... linking ... done.
> Prelude> :t [[1,2],3]
>
> <interactive>:1:8:
> Couldn't match expected type `[Integer]' with actual type `Integer'
> Expected type: Integer -> [Integer]
> Actual type: Integer -> Integer
> In the expression: 3
> In the expression: [[1, 2], 3]
> Prelude> [[1,2],3]
>
> <interactive>:3:8:
>
> Couldn't match expected type `[Integer]' with actual type `Integer'
> Expected type: Integer -> [Integer]
> Actual type: Integer -> Integer
> In the expression: 3
> In the expression: [[1, 2], 3]
> Prelude>
>
> So far so good -- when an expression is type-wrong, its 'wrongness' is
the same irrespective of whether I ask for its type or evaluate it.
>
> But now we are in for new surprises: Try out
> f x y = x / y
> Prelude> :l f
> [1 of 1] Compiling Main ( f.hs, interpreted )
>
> f.hs:1:11: Not in scope: `/'
> Failed, modules loaded: none.
> Prelude> (/)
>
> Oh is it that now integer literals are just plain Integers and cant be
divided using '/' ??
>
> So lets replace '/' with '+'
> f.hs:1:11: Not in scope: `+'
>
> And now I am at my wits end!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20121228/912a22e3/attachment.htm>
More information about the Haskell-Cafe
mailing list