haskell.foundation

jaror, to haskell in Haskell Interlude 41: Mike Angermann
jaror avatar

The discussion about incentives for stability was interesting. It reminded me of the maintainership standards proposal. I think it would be very useful to have Hackage show information like how quickly a package fixes version bounds when new versions of their dependencies are released.

Profpatsch, to haskell in Haskell Interlude 44: José Manuel Calderón Trilla
@Profpatsch@mastodon.xyz avatar

@jaror Unfortunately, the rss feed has not yet caught up I feel

jaror,
jaror avatar

That's odd. This latest episode is indeed not mentioned on there: https://feeds.buzzsprout.com/1817535.rss. I'd guess it is something on buzzsprout's side.

Profpatsch,
@Profpatsch@mastodon.xyz avatar

@jaror yeah it's still not up

jaror,
jaror avatar
jaror, to haskell in Haskell Interlude 38: Edwin Brady
jaror avatar

I think Idris' bang notation for performing effects in a do-block is pretty, it could look like this:

main = do putStrLn ("You said: " ++ !getLine)

Today, you'd have to come up with a new variable name or figure out the right combinator names:

main = do line <- getLine; putStrLn ("You said: " ++ line)

main = putStrLn . ("You said: " ++) =<< getLine

But unfortunately there are more complicated cases:

main = do print (True || !getLine == "foo")

In a strict language with built-in short-circuiting logical operations the getLine would never be performed, but in Haskell || is just a normal function that happens to be lazy in its second argument. The only reasonable way to implement it seems to be to treat every function as if it was strict and always perform the getLine:

main = do line <- getLine; print (True || line == "foo")

Do you think this is confusing? Or is the bang notation useful enough that you can live with these odd cases? I'm not very happy with this naive desugaring.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror I never liked it; I think if you can't be bothered to assign a name, point-free combinators are what you should be using.

I also think it gets much uglier or complicated (or both) once you have arguments (unlike getLine, but like most subroutines).

That said, I wouldn't take it away from anyone. I think the desugaring is unsurprising and, at least in a strict language, semantics preserving.

I haven't really spent the necessary time to think clearly through the non-strict case.

bss03,

hachyderm.io/…/111535813328842924 (This might be a duplicate, but I’m not seeing it, on my instance, yet.)

barubary,

@jaror

main = do putStrLn (cycle "buffalo " ++ !getLine)<br></br>
jaror, (edited ) to haskell in Haskell Interlude: Episode 37 – John MacFarlane
jaror avatar

Djot looks very cool: https://djot.net/.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror SSL_ERROR_BAD_CERT_DOMAIN for me. 😩

jaror,
jaror avatar

Oops, it seems this was my fault, the link should have been https://djot.net

jaror, to haskell in Haskell Interlude 36 - John Hughes
jaror avatar

Great point about Haskell seemingly becoming less and less easy to learn for beginners around 15:00. I hope some day we get a language levels system where you can start with a very simple subset and slowly expand to the full language.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror Haskell 2010 is pretty simple. What do you imagine is the simpler starting point, if any? If Haskell 2010 is a good starting point, aren't language pragmas / extensions effectively the same as your "language levels"?

jaror,
jaror avatar

Type classes are a big cause of confusion among newcomers, and even parametric polymorphism.

If you want to see how simple a language can really get you should check out Hedy: https://www.hedycode.com/. It even removes string quotes (let alone variables) at the simplest level. Although it is too imperative for my taste.

dpwiz,
@dpwiz@qoto.org avatar

@jaror @BoydStephenSmithJr Type classes have been in Haskell since forever. There’s no Haskell “level” that would avoid them while being a level of Haskell instead of some vague/generic “functional programming”.
If you want to teach Haskell - you teach Haskell, with its staples like type classes and laziness.

jaror,
jaror avatar

I'm not suggesting you should never explain type classes. I simply want to avoid having to explain type classes before I can explain how to add two integers. And more importantly, I don't want error messages to mention type classes until they have been understood.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror @dpwiz I think without the type of polymorphism that Haskell uses type classes for, the language can never be more than a toy.

But, that doesn't mean it can't be didactically useful. A "Haskell--" with a JS-style Number for all numeric literals and replacing all numeric type classes with top-level operators on that type could be useful, for a bit.

Once you want to do indexing (e.g. Array) you need to distinguish between numbers like sqrt 5 and suitable indexes, tho. Enter polymorphism

jaror,
jaror avatar

There are so many options to work around type classes. As you say, we could be looser with our types and have one general number type that includes integers and floats. (And I don't even think array indexing is much of a problem, it could just throw an error or automatically round to an integer.)

Another option is to just have separate number types with separate functions for addition and multiplication etc. For example OCaml has + and +..

Perhaps more of a stepping stone towards full type classes would be a limited system where only a few pre-defined classes and instances exist. Then you'll never run into the dreadful could not deduce Num (a -> b) error message, but you can still use a nice overloaded + for both Int and Double.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror @dpwiz Your first proposal is to sacrifice type safety. I reject that option; avoid success at all costs.

Your second actually increases complexity through semantic bifurcation . I reject that as a way to make a simpler language, even for didactic purposes.

No, discarding type classes without adopting something else worse (interface inheritance) is not easy, and may actually be impossible.

jaror,
jaror avatar

I'm not sure which options you are referring to, I had three options: a JS-style number type (with two suboptions for indexing: throwing errors or rounding), separate types, or a fixed set of classes and instances.

Your first point seems to be against the error throwing approach to array indexing with a JS-style number type. I kind of agree, but then we should also handle out of bounds indexing in a type safe way. I still don't see the problem with rounding to an integer, I think that's also what beginners intuitively expect if they write e.g. xs !! (length xs / 2).

Your second point seems to be against having separate types and separate instructions like + and +.. I think I'd agree that semantically it is not much simpler, but programming is more than just semantics. For example, error messages will be much simpler if there's no Num type class involved (at least the error messages that GHC gives). Perhaps it is possible to develop a better error reporting mechanism for type classes, but that would require more research.

Did I interpret your comment correctly?

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror @dpwiz Yes.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror I absolutely disagree that error messages would be better if we didn't have type classes. Languages with the other popular ad-hoc polymorphism (interface inheritance) have similarly opaque (initially) error messages of approximately the same length OR promote the failure to a run time error, a much worse situation.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror Implicit rounding or other conversion also undermines type safety, though if the conversion is total, not in the strict sense of "well typed programs don't go wrong" but in the sense of safety is when our expectations align with the results, something easily violated by allowing floating point indexes.

BoydStephenSmithJr,
@BoydStephenSmithJr@hachyderm.io avatar

@jaror @dpwiz Your third option has been tried and failed multiple times, most recently in Elm. Programmers that need that kind of extension route around the denial and produce a (sometimes limited, often more awkward) library solution and then ship adaptors for all the primitives in the language, replacing the native (but non-extensible) name overloading.

This ends up making for a more complex ecosystem, and frustration when learners are taught native, but everyone uses library.

dpwiz,
@dpwiz@qoto.org avatar

@jaror @BoydStephenSmithJr Understandable… I’ve thought default rules made that possible.

Anyway, I didn’t encounter much problems with type classes while teaching Haskell, not even as a first language. May all of my students were okay with some suspense 😅

jaror, to haskell in Haskell Interlude 30: Bartosz Milewski
jaror avatar

I love the connection between Haskell and C++ template metaprogramming.

jaror,
jaror avatar

Maybe we should try to market Haskell more to C++ programmers.

ernest, to haskell in Haskell Interlude 30: Bartosz Milewski
ernest avatar

BartoszMilewski Mastodon account

jaror, to haskell in Haskell Interlude Podcast 28 - Richard Eisenberg
jaror avatar

I love the call to work on the Local modules proposal at the end. It seems so useful and so close to ready.

There are only 2 open issues which he explains in this GitHub comment.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • megavids
  • kavyap
  • DreamBathrooms
  • thenastyranch
  • magazineikmin
  • InstantRegret
  • GTA5RPClips
  • Youngstown
  • everett
  • slotface
  • rosin
  • osvaldo12
  • mdbf
  • ngwrru68w68
  • JUstTest
  • cubers
  • modclub
  • normalnudes
  • tester
  • khanakhh
  • Durango
  • ethstaker
  • tacticalgear
  • Leos
  • provamag3
  • anitta
  • cisconetworking
  • lostlight
  • All magazines