Proposal: Improving the IsString String instance

Edward Kmett ekmett at gmail.com
Wed Aug 28 05:18:56 CEST 2013


On Tue, Aug 27, 2013 at 3:27 AM, Simon Peyton-Jones
<simonpj at microsoft.com>wrote:

> If I understand aright, the problem is that we end up with constraints like
>         IsString alpha
> or
>         IsString [beta]
> where alpha or beta are otherwise-unconstrained unification variables.
>  Under those circumstances we'd like to default to IsString String.
>
> This is *exactly* what the current type-class-defaulting mechanism does.
>  Eg with (show 3) you get (Show alpha, Num alpha) and want to choose alpha
> to be something sensible.
>

I may be misunderstanding you, as I thought I understood EDR pretty well.

Defaulting and EDR both as I understand it look for a type variable a that
only occurs in constraints of the forms (C1 a, C2 a, ..., Cn a), but

Your (Show alpha, Num alpha) works because it is in that form.

IsString a works, with appropriate changes to defaulting, but IsString [a]
doesn't look like it would meet the condition, and my recollection from
trying variations on this trick, it doesn't work in practice.

That was what Ganesh's proposal was to facilitate. It ensured that we had
some class in form for the (C1 a, C2 a, ..., Cn a)  check.

If we can get by without that, I'm 100% for it!

-Edward



> We've already extended it for GHCi
>
> http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html#extended-default-rules
>
> I don't think this would be controversial.  The path seems to be:
>         propose a concrete extension to the rules,
>         specify when it's enabled
>         get everyone to agree
>         provide a patch (relevant code is in
> TcSimplify.applyDefaultingRules)
>
> Simon
>
> | -----Original Message-----
> | From: Libraries [mailto:libraries-bounces at haskell.org] On Behalf Of
> | Ganesh Sittampalam
> | Sent: 26 August 2013 21:55
> | To: Edward Kmett
> | Cc: Haskell Libraries
> | Subject: Re: Proposal: Improving the IsString String instance
> |
> | Couldn't it work (with suitable extensions to the list of blessed
> | classes) with Henning's IsCharList suggestion? The unresolved constraint
> | would be IsCharList a.
> |
> | On 26/08/2013 21:47, Edward Kmett wrote:
> | > The problem is ExtendedDefaultRules only works when the whole type is
> | > unknown. If we know part of the type e.g. that it is [a] for some a as
> | > we figure out from length, or that it is (f a), then it doesn't kick
> | in.
> | >
> | > print works because "hello" :: (IsString a, Show a) => a
> | >
> | > knows nothing about the argument a
> | >
> | > and Show is included in the EDR list of blessed classes.
> | >
> | > If at the repl you turn on OverloadedStrings and EDR
> | >
> | > showList "hello" ""
> | >
> | > will still blow up, because it can know you have an argument [a] with
> | a
> | > Show a constraint on it, and IsString [a], so it fails to meet the
> | > fairly simplistic conditions required by EDR.
> | >
> | > -Edward
> | >
> | >
> | > On Mon, Aug 26, 2013 at 4:34 PM, Dag Odenhall <dag.odenhall at gmail.com
> | > <mailto:dag.odenhall at gmail.com>> wrote:
> | >
> | >     |ExtendedDefaultRules| already provides this to some extent, for
> | >     example it makes |print "hello"| work without type information.
> | >
> | >
> | >
> | >     On Mon, Aug 26, 2013 at 10:09 PM, Dan Burton
> | >     <danburton.email at gmail.com <mailto:danburton.email at gmail.com>>
> | wrote:
> | >
> | >         Just to throw another curveball at this conversation, what
> | about
> | >         a general, ad-hoc solution for 'typeclass defaults'? The logic
> | >         goes like this: Is there an "ambiguous type variable" error
> | due
> | >         to the use of the IsString typeclass? Try defaulting to the
> | >         String instance. If that doesn't work, try defaulting to Text.
> | >         Repeat for a finite, explicit list of instances. If none of
> | >         these defaults are successful, type error.
> | >
> | >         We have hard-coded this sort of behavior into the Num class.
> | Why
> | >         not just provide this general capability for arbitrary
> | classes?
> | >         Or at least hard-code it into IsString as well.
> | >
> | >         In the absence of this sort of solution, +1 to Edward's
> | original
> | >         proposal.
> | >
> | >         The "o" proposal is not viable because the oft-needed parens
> | >         make it confusing and irritating to the new Haskeller.
> | >
> | >         -- Dan Burton
> | >
> | >
> | >         On Mon, Aug 26, 2013 at 12:41 PM, Henning Thielemann
> | >         <lemming at henning-thielemann.de
> | >         <mailto:lemming at henning-thielemann.de>> wrote:
> | >
> | >
> | >             On Mon, 26 Aug 2013, Gabriel Gonzalez wrote:
> | >
> | >                 I'm guessing this is sarcastic, but I just want to
> | >                 clarify what I understood Henning's proposal to be.
> | >                  He's not saying we should provide an `o` function in
> | >                 the standard library, but rather encourage users to
> | >                 define their own.
> | >
> | >
> | >             Yes. I would be ok if packages provide this function, but
> | I
> | >             would urge programmers to import that explicitly.
> | >
> | >
> | >                  This one liner would take the place of the current
> | line
> | >                 that they devote right now to `OverloadedStrings` .
> | >
> | >
> | >             right
> | >
> | >
> | >                 However, the analogy is still apt since the exact same
> | >                 line of reasoning applies to overloaded numeric
> | >                 literals where we currently rely on defaulting to
> | solve
> | >                 this problem.
> | >
> | >
> | >             I always use -Wall and thus I am warned about when
> | >             defaulting takes place. Thus I am confident that I do not
> | >             rely on defaulting in my code.
> | >
> | >             _______________________________________________
> | >             Libraries mailing list
> | >             Libraries at haskell.org <mailto:Libraries at haskell.org>
> | >             http://www.haskell.org/mailman/listinfo/libraries
> | >
> | >
> | >
> | >         _______________________________________________
> | >         Libraries mailing list
> | >         Libraries at haskell.org <mailto:Libraries at haskell.org>
> | >         http://www.haskell.org/mailman/listinfo/libraries
> | >
> | >
> | >
> | >     _______________________________________________
> | >     Libraries mailing list
> | >     Libraries at haskell.org <mailto:Libraries at haskell.org>
> | >     http://www.haskell.org/mailman/listinfo/libraries
> | >
> | >
> | >
> | >
> | > _______________________________________________
> | > Libraries mailing list
> | > Libraries at haskell.org
> | > http://www.haskell.org/mailman/listinfo/libraries
> | >
> |
> |
> | _______________________________________________
> | Libraries mailing list
> | Libraries at haskell.org
> | http://www.haskell.org/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20130827/3b8bdc79/attachment.htm>


More information about the Libraries mailing list