This is basically what you get by default already with the raw proposal we've been talking about -- the Preludes in the haskell98 and haskell2010 remain unmodified by this proposal and are available for teaching use.
Sent from my iPhone On May 27, 2013, at 8:53 PM, Andrew Farmer <afar...@ittc.ku.edu> wrote: > I generally agree with Iavor's points, but if this is such an issue, why not > make Prelude more general by default and have a special 'Prelude.Basic' with > the more specific type signatures for beginners? The general Prelude would be > implicitly imported as now, unless the module imported Prelude.Basic > unqualified. Then make Hackage warn/reject packages that use Prelude.Basic. > > Tutorials/Books would have to tell readers to add a magic "import > Prelude.Basic" at the beginning of their source files, but tutorials for > other languages do this (public static void main(..)?) to relatively little > complaint. > > Sorry, I'm sure this has been proposed before... but the proposed extension > seems complicated to avoid some qualified imports/hidings. If we really want > people to use Foldable's foldr by default, then make it the default and let > beginners add a magic line once per file to get simpler types. > > Andrew > > > On Mon, May 27, 2013 at 5:07 PM, Daniel Gorín <dgo...@dc.uba.ar> wrote: >> Hi Iavor, >> >> On May 27, 2013, at 6:18 PM, Iavor Diatchki wrote: >> >> > Hello, >> > >> > >> > On Fri, May 24, 2013 at 12:42 AM, Daniel Gorín <dgo...@dc.uba.ar> wrote: >> > On May 24, 2013, at 9:28 AM, Simon Peyton-Jones wrote: >> > >> >> > How about (in Haskell98) >> >> > >> >> > module Data.List ( foldr, ...) >> >> > import qualified Data.Foldable >> >> > foldr :: (a -> b -> b) -> b -> [a] -> b >> >> > foldr = Data.Foldable.foldr >> >> >> >> It would not be the same! Using your example one will get that the >> >> following fails to compile: >> >> >> >> > import Data.List >> >> > import Data.Foldable >> >> > f = foldr >> >> >> >> The problem is that Data.List.foldr and Data.Foldable.foldr are here >> >> different symbols with the same name. >> >> This is precisely why Foldable, Traversable, Category, etc are awkward to >> >> use. The proposal is to make Data.List reexport Data.Foldable.foldr (with >> >> a more specialized type) so that the module above can be accepted. >> >> >> > >> > I think that it is perfectly reasonable for this to fail to compile---to >> > me, this sort of implicit shadowing based on what extensions are turned on >> > would be very confusing. It may seem obvious with a well-known example, >> > such as `foldr`, but I can easily imagine getting a headache trying to >> > figure out a new library that makes uses the proposed feature in anger :) >> >> I understand your concern, but I don't quite see how a library could abuse >> this feature. I mean, a library could export the same symbol with different >> specialized types in various modules, but you, the user of the library, will >> see them as different symbols with conflicting name, just like now you see >> symbols Prelude.foldr and Data.Foldable.foldr exported by base... unless, of >> course, you specifically activate the extension (the one called >> MoreSpecificImports in my first mail). That is, it would be an opt-in >> feature. >> >> > Also, using module-level language extensions does not seem like the right >> > tool for this task: what if I wanted to use the most general version of >> > one symbol, but the most specific version of another? >> >> Do you have a particular example in mind? The more general version of every >> symbol can be used wherever the more specialized one fits, and in the >> (seemingly rare?) case where the extra polymorphism may harm you and that >> adding a type annotation is not convenient enough, you could just hide the >> import of more the general version. Do you anticipate this to be a common >> scenario? >> >> > One needs a more fine grained tool, and I think that current module >> > system already provides enough features to do so (e.g., explicit export >> > lists, `hiding` clauses`, and qualified imports). For example, it really >> > does not seem that inconvenient (and, in fact, I find it helpful!) to >> > write the following: >> > >> > import Data.List hiding (foldr) >> > import Data.Foldable >> >> But this doesn't scale that well, IMO. In real code even restricted to the >> the base package the hiding clauses can get quite long and qualifying basic >> polymorphic functions starts to feel like polymorphism done wrong. >> >> This can very well be just a matter of taste, but apparently so many people >> have strong feelings about this issue that it is seriously being proposed to >> move Foldable and Traversable to the Prelude, removing all the monomorphic >> counterparts (that is, make Prelude export the unspecialized versions). >> While this would be certainly convenient for me, I think it would be an >> unfortunate move: removing concrete (monomorphic) functions in favor of >> abstract versions will make a language that is already hard to learn, even >> harder (but there was a long enough thread in the libraries mailing list >> about this already!). In any case this proposal is an attempt to resolve >> this tension without "penalizing" any of the sides. >> >> Thanks, >> Daniel >> _______________________________________________ >> Glasgow-haskell-users mailing list >> Glasgow-haskell-users@haskell.org >> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users > > _______________________________________________ > Glasgow-haskell-users mailing list > Glasgow-haskell-users@haskell.org > http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users