<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>A bit of time away from my keyboard has revealed a natural way to solve this problem and others: be more like Idris.</div><div><br></div><div>Normally, of course, I'm thinking about how Haskell's type system can be more like Idris's. But that's not what I mean here. I want Haskell's interface to be more like Idris's. Imagine this interchange:</div><div><br></div><div>λ> :t ($)</div><div>($) :: (a -> b) -> a -> b</div><div>-- click on the type</div><div>($) :: forall a b. (a -> b) -> a -> b</div><div>-- click on the a</div><div>($) :: forall (a :: *) b. (a -> b) -> a -> b</div><div>-- click on the b</div><div>($) :: forall (a :: *) (b :: *). (a -> b) -> a -> b   -- where b's kind has a different color than usual</div><div>-- click on b's kind</div><div>($) :: forall {r :: RuntimeRep} (a :: *) (b :: TYPE r). (a -> b) -> a -> b</div><div>-- mouseover RuntimeRep or TYPE reveals a tooltip</div><div>"($) is representation-polymorphic, meaning that `b` can have an arbitrary runtime representation. Please see http://.... for more details."</div><div><br></div><div>Similarly, classes would render in a special color, allowing you to click on them and choose to instantiate the type at a few in-scope instances of the class at hand, changing Foldable f => f a -> Int to the much simpler [a] -> Int.</div><div><br></div><div>This is not a minor engineering project, but it would reap wonderful rewards, addressing the problems in this thread and more. No more lying (because all lies are clickable), no more fragmented language, no more brakes on development.</div><div><br></div><div>Evidently, Chris already agrees with this proposal: #10073 (<a href="https://ghc.haskell.org/trac/ghc/ticket/10073">https://ghc.haskell.org/trac/ghc/ticket/10073</a>)</div><div><br></div><div>Also see #8809 (<a href="https://ghc.haskell.org/trac/ghc/ticket/8809">https://ghc.haskell.org/trac/ghc/ticket/8809</a>)</div><div><br></div><div>Any volunteers to implement this? :)</div><div><br></div><div>Richard</div><br><div><div>On Feb 5, 2016, at 7:47 PM, Artyom <<a href="mailto:yom@artyom.me">yom@artyom.me</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
  
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div style="" class="markdown-here-wrapper" data-md-url="Thunderbird"><p style="margin: 1.2em 0px ! important;">I’ve amended my
        suggestion to say basically “this type is a slight lie, here’s a
        flag/command to see the true type” – this way we aren’t scaring
        people with implementation guts, merely letting them see the
        guts for themselves and then think “I don’t care about this”
        (which is, I think, exactly what should happen; the worst
        scenario here is that the beginner falls into the “I’m an
        advanced user, I need all features, I need to know everything,
        so I’ll enable the flag” trap – which is why it’s important not
        to call it “an advanced type” or mention “if you know what
        you’re doing” or anything else like that).</p><p style="margin: 1.2em 0px ! important;">I don’t agree that
        levity can be compared to Java’s “class” or “static” – not
        because it’s harder to understand, but because it’s much less
        widely used; I don’t feel that you need to know about levity in
        order to be a good Haskeller. Also, unboxed types don’t imply
        knowledge of levity – for instance, I’ve been successfully using
        unboxed types for a while, but I only found out about the true
        type of <code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">($)</code>
        by complete accident (I think I queried the kind of <code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">-></code>
        and then got curious about question marks). Of</p><p style="margin: 1.2em 0px ! important;">On 02/06/2016 03:27 AM,
        Mihai Maruseac wrote:</p><div style="margin: 1.2em 0px !important; "><br class="webkit-block-placeholder"></div>
      <div class="markdown-here-exclude"><div><br class="webkit-block-placeholder"></div>
        <blockquote cite="mid:CAOMsUMLwO29J0Ld-TeCDe=n9b6YWf91jXPhhBoXBjseKaLzzOw@mail.gmail.com" type="cite">
          <pre wrap="">On Fri, Feb 5, 2016 at 7:09 PM, Richard Eisenberg <a class="moz-txt-link-rfc2396E" href="mailto:eir@cis.upenn.edu"><eir@cis.upenn.edu></a> wrote:
</pre>
          <blockquote type="cite">
            <pre wrap="">Another great question that has come up is about Haddock output (Hackage). I
think Haddock needs to add a facility where library authors can include
specializations of an overly general type. This can be done in commentary,
but it's not as prominent. Such a new feature would address the ($) problem,
as ($) :: forall (a :: *) (b :: *). (a -> b) -> a -> b is a specialization
of its real type. It would also help a great deal with FTP-related
generalizations.
</pre>
          </blockquote>
          <pre wrap="">This goes hand in hand with Artyom's suggestion of a warning in GHCi
after showing the simpler type.

I'm thinking of a flag which enables/disables printing the simplest
type with warning (in GHCi) or footnote (or otherwise, in Haddock). We
can have the default behavior of the flag be either printing the
simpler type + extra (warning/footnote) or printing the longer type
and include a reference in our learning materials that beginners and
people confused by the long, complex and real type, can use
--use-simpler-types flag.

</pre>
        </blockquote><div><br class="webkit-block-placeholder"></div>
      </div><div style="margin: 1.2em 0px !important; "><br class="webkit-block-placeholder"></div>
      <div title="MDH:SSd2ZSBhbWVuZGVkIG15IHN1Z2dlc3Rpb24gdG8gc2F5IGJhc2ljYWxseSDigJx0aGlzIHR5cGUgaXMgYSBzbGlnaHQgbGllLCBoZXJlJ3MgYSBmbGFnL2NvbW1hbmQgdG8gc2VlIHRoZSB0cnVlIHR5
cGXigJ0g4oCTIHRoaXMgd2F5IHdlIGFyZW4ndCBzY2FyaW5nIHBlb3BsZSB3aXRoIGltcGxlbWVu
dGF0aW9uIGd1dHMsIG1lcmVseSBsZXR0aW5nIHRoZW0gc2VlIHRoZSBndXRzIGZvciB0aGVtc2Vs
dmVzIGFuZCB0aGVuIHRoaW5rIOKAnEkgZG9uJ3QgY2FyZSBhYm91dCB0aGlz4oCdICh3aGljaCBp
cywgSSB0aGluaywgZXhhY3RseSB3aGF0IHNob3VsZCBoYXBwZW47IHRoZSB3b3JzdCBzY2VuYXJp
byBoZXJlIGlzIHRoYXQgdGhlIGJlZ2lubmVyIGZhbGxzIGludG8gdGhlIOKAnEknbSBhbiBhZHZh
bmNlZCB1c2VyLCBJIG5lZWQgYWxsIGZlYXR1cmVzLCBJIG5lZWQgdG8ga25vdyBldmVyeXRoaW5n
LCBzbyBJJ2xsIGVuYWJsZSB0aGUgZmxhZ+KAnSB0cmFwIOKAkyB3aGljaCBpcyB3aHkgaXQncyBp
bXBvcnRhbnQgbm90IHRvIGNhbGwgaXQg4oCcYW4gYWR2YW5jZWQgdHlwZeKAnSBvciBtZW50aW9u
IOKAnGlmIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5n4oCdIG9yIGFueXRoaW5nIGVsc2UgbGlr
ZSB0aGF0KS48YnI+PGJyPkkgZG9uJ3QgYWdyZWUgdGhhdCBsZXZpdHkgY2FuIGJlIGNvbXBhcmVk
IHRvIEphdmEncyDigJxjbGFzc+KAnSBvciDigJxzdGF0aWPigJ0g4oCTIG5vdCBiZWNhdXNlIGl0
J3MgaGFyZGVyIHRvIHVuZGVyc3RhbmQsIGJ1dCBiZWNhdXNlIGl0J3MgbXVjaCBsZXNzIHdpZGVs
eSB1c2VkOyBJIGRvbid0IGZlZWwgdGhhdCB5b3UgbmVlZCB0byBrbm93IGFib3V0IGxldml0eSBp
biBvcmRlciB0byBiZSBhIGdvb2QgSGFza2VsbGVyLiBBbHNvLCB1bmJveGVkIHR5cGVzIGRvbid0
IGltcGx5IGtub3dsZWRnZSBvZiBsZXZpdHkg4oCTIGZvciBpbnN0YW5jZSwgSSd2ZSBiZWVuIHN1
Y2Nlc3NmdWxseSB1c2luZyB1bmJveGVkIHR5cGVzIGZvciBhIHdoaWxlLCBidXQgSSBvbmx5IGZv
dW5kIG91dCBhYm91dCB0aGUgdHJ1ZSB0eXBlIG9mIGAoJClgIGJ5IGNvbXBsZXRlIGFjY2lkZW50
IChJIHRoaW5rIEkgcXVlcmllZCB0aGUga2luZCBvZiBgLSZndDtgIGFuZCB0aGVuIGdvdCBjdXJp
b3VzIGFib3V0IHF1ZXN0aW9uIG1hcmtzKS4gT2Y8YnI+PGJyPjxkaXYgY2xhc3M9Im1vei1jaXRl
LXByZWZpeCI+T24gMDIvMDYvMjAxNiAwMzoyNyBBTSwgTWloYWkgTWFydXNlYWMgd3JvdGU6PGJy
PjwvZGl2PjxibG9ja3F1b3RlIGNpdGU9Im1pZDpDQU9Nc1VNTHdPMjlKMExkLVRlQ0RlPW45YjZZ
V2Y5MWpYUGhoQm9YQmpzZUthTHp6T3dAbWFpbC5nbWFpbC5jb20iIHR5cGU9ImNpdGUiPjxwcmUg
d3JhcD0iIj5PbiBGcmksIEZlYiA1LCAyMDE2IGF0IDc6MDkgUE0sIFJpY2hhcmQgRWlzZW5iZXJn
ICZsdDtlaXJAY2lzLnVwZW5uLmVkdSZndDsgd3JvdGU6CjwvcHJlPjxibG9ja3F1b3RlIHR5cGU9
ImNpdGUiPjxwcmUgd3JhcD0iIj4KQW5vdGhlciBncmVhdCBxdWVzdGlvbiB0aGF0IGhhcyBjb21l
IHVwIGlzIGFib3V0IEhhZGRvY2sgb3V0cHV0IChIYWNrYWdlKS4gSQp0aGluayBIYWRkb2NrIG5l
ZWRzIHRvIGFkZCBhIGZhY2lsaXR5IHdoZXJlIGxpYnJhcnkgYXV0aG9ycyBjYW4gaW5jbHVkZQpz
cGVjaWFsaXphdGlvbnMgb2YgYW4gb3Zlcmx5IGdlbmVyYWwgdHlwZS4gVGhpcyBjYW4gYmUgZG9u
ZSBpbiBjb21tZW50YXJ5LApidXQgaXQncyBub3QgYXMgcHJvbWluZW50LiBTdWNoIGEgbmV3IGZl
YXR1cmUgd291bGQgYWRkcmVzcyB0aGUgKCQpIHByb2JsZW0sCmFzICgkKSA6OiBmb3JhbGwgKGEg
OjogKikgKGIgOjogKikuIChhIC0mZ3Q7IGIpIC0mZ3Q7IGEgLSZndDsgYiBpcyBhIHNwZWNpYWxp
emF0aW9uCm9mIGl0cyByZWFsIHR5cGUuIEl0IHdvdWxkIGFsc28gaGVscCBhIGdyZWF0IGRlYWwg
d2l0aCBGVFAtcmVsYXRlZApnZW5lcmFsaXphdGlvbnMuCjwvcHJlPjwvYmxvY2txdW90ZT48cHJl
IHdyYXA9IiI+CgpUaGlzIGdvZXMgaGFuZCBpbiBoYW5kIHdpdGggQXJ0eW9tJ3Mgc3VnZ2VzdGlv
biBvZiBhIHdhcm5pbmcgaW4gR0hDaQphZnRlciBzaG93aW5nIHRoZSBzaW1wbGVyIHR5cGUuCgpJ
J20gdGhpbmtpbmcgb2YgYSBmbGFnIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgcHJpbnRpbmcgdGhl
IHNpbXBsZXN0CnR5cGUgd2l0aCB3YXJuaW5nIChpbiBHSENpKSBvciBmb290bm90ZSAob3Igb3Ro
ZXJ3aXNlLCBpbiBIYWRkb2NrKS4gV2UKY2FuIGhhdmUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2Yg
dGhlIGZsYWcgYmUgZWl0aGVyIHByaW50aW5nIHRoZQpzaW1wbGVyIHR5cGUgKyBleHRyYSAod2Fy
bmluZy9mb290bm90ZSkgb3IgcHJpbnRpbmcgdGhlIGxvbmdlciB0eXBlCmFuZCBpbmNsdWRlIGEg
cmVmZXJlbmNlIGluIG91ciBsZWFybmluZyBtYXRlcmlhbHMgdGhhdCBiZWdpbm5lcnMgYW5kCnBl
b3BsZSBjb25mdXNlZCBieSB0aGUgbG9uZywgY29tcGxleCBhbmQgcmVhbCB0eXBlLCBjYW4gdXNl
Ci0tdXNlLXNpbXBsZXItdHlwZXMgZmxhZy4KCjwvcHJlPgoKPC9ibG9ja3F1b3RlPjxicj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </div>

</blockquote></div><br></body></html>