Iavor, Alex’s example can be well-typed if we allow first-class existentials:
[1, ‘a’, “b”] :: [exists a. Show a => a] This has nothing to do with the definition of lists. I believe the confusion was between existential types and impredicative types, as Simon has pointed out. - Vlad > On 6 Sep 2019, at 20:56, Iavor Diatchki <iavor.diatc...@gmail.com> wrote: > > Hello Alex, > > the issue with your example is not the mapping of `show` but the list > `[1, 'a', "b"]`. It is not well typed simply because of how lists are > defined. Remember that `[1, 'a', "b"]` is not really special---it is > just syntactic sugar for `1 : 'a' : "b" : []` and the type of `(:)` > requires the elements to have the same type. > > Of course, in principle, one could define a different list type that > allowed values of arbitrary types to be stored in it (e.g., the > example list would be just of type `List`). > The issue is that you can't really use the elements of such a list as > you wouldn't know what type they have. > > Yet another option is to define a list type where the "cons" operation > remembers the types of the elements in the type of the constructed > list---at this point the lists become more like tuples (e.g., the > example would be of type `List [Int,Char,String]`). This is > possible, but then them `map` function would have an interesting > type... > > I'd be happy to answer more questions but I don't want to side-track > the thread as all this is quite orthogonal to impredicative types. > > -Iavor > > > > > > > > > > On Fri, Sep 6, 2019 at 7:21 AM Alex Rozenshteyn <rpglove...@gmail.com> wrote: >> >> Hi Simon, >> >> You're exactly right, of course. My example is confusing, so let me see if I >> can clarify. >> >> What I want in the ideal is map show [1, 'a', "b"]. That is, minimal >> syntactic overhead to mapping a function over multiple values of distinct >> types that results in a homogeneous list. As the reddit thread points out, >> there are workarounds involving TH or wrapping each element in a constructor >> or using bespoke operators, but when it comes down to it, none of them >> actually allows me to say what I mean; the TH one is closest, but I reach >> for TH only in times of desperation. >> >> I had thought that one of the things preventing this was lack of >> impredicative instantiation, but now I'm not sure. Suppose Haskell did have >> existentials; would map show @(exists a. Show a => a) [1, 'a', "b"] work in >> current Haskell and/or in quick-look? >> >> Tangentially, do you have a reference for what difficulties arise in adding >> existentials to Haskell? I have a feeling that it would make working with >> GADTs more ergonomic. >> >> On Fri, Sep 6, 2019 at 12:33 AM Simon Peyton Jones <simo...@microsoft.com> >> wrote: >>> >>> I’m confused. Char does not have the type (forall a. Show a =>a), so our >>> example is iill-typed in System F, never mind about type inference. >>> Perhaps there’s a typo? I think you may have ment >>> >>> exists a. Show a => a >>> >>> which doesn’t exist in Haskell. You can write existentials with a data type >>> >>> >>> >>> data Showable where >>> >>> S :: forall a. Show a => a -> Showable >>> >>> >>> >>> Then >>> >>> map show [S 1, S ‘a’, S “b”] >>> >>> works fine today (without our new stuff), provided you say >>> >>> >>> >>> instance Show Showable where >>> >>> show (S x) = show x >>> >>> >>> >>> Our new system can only type programs that can be written in System F. >>> (The tricky bit is inferring the impredicative instantiations.) >>> >>> >>> >>> Simon >>> >>> >>> >>> From: ghc-devs <ghc-devs-boun...@haskell.org> On Behalf Of Alex Rozenshteyn >>> Sent: 06 September 2019 03:31 >>> To: Alejandro Serrano Mena <trup...@gmail.com> >>> Cc: GHC developers <ghc-devs@haskell.org> >>> Subject: Re: New implementation for `ImpredicativeTypes` >>> >>> >>> >>> I didn't say anything when you were requesting use cases, so I have no >>> right to complain, but I'm still a little disappointed that this doesn't >>> fix my (admittedly very minor) issue: >>> https://www.reddit.com/r/haskell/comments/3am0qa/existentials_and_the_heterogenous_list_fallacy/csdwlp2/?context=8&depth=9 >>> >>> >>> >>> For those who don't want to click on the reddit link: I would like to be >>> able to write something like map show ([1, 'a', "b"] :: [forall a. Show a >>> => a]), and have it work. >>> >>> >>> >>> On Wed, Sep 4, 2019 at 8:13 AM Alejandro Serrano Mena <trup...@gmail.com> >>> wrote: >>> >>> Hi all, >>> >>> As I mentioned some time ago, we have been busy working on a new >>> implementation of `ImpredicativeTypes` for GHC. I am very thankful to >>> everybody who back then sent us examples of impredicativity which would be >>> nice to support, as far as we know this branch supports all of them! :) >>> >>> >>> >>> If you want to try it, at >>> https://gitlab.haskell.org/trupill/ghc/commit/a3f95a0fe0f647702fd7225fa719a8062a4cc0a5/pipelines?ref=quick-look-build >>> you can find the result of the pipeline, which includes builds for several >>> platforms (click on the "Artifacts" button, the one which looks like a >>> cloud, to get them). The code is being developed at >>> https://gitlab.haskell.org/trupill/ghc. >>> >>> >>> >>> Any code should run *unchanged* except for some eta-expansion required for >>> some specific usage patterns of higher-rank types. Please don't hesitate to >>> ask any questions or clarifications about it. A merge request for tracking >>> this can be found at https://gitlab.haskell.org/ghc/ghc/merge_requests/1659 >>> >>> >>> >>> Kind regards, >>> >>> Alejandro >>> >>> _______________________________________________ >>> ghc-devs mailing list >>> ghc-devs@haskell.org >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs >> >> _______________________________________________ >> ghc-devs mailing list >> ghc-devs@haskell.org >> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs > _______________________________________________ > ghc-devs mailing list > ghc-devs@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs