In this episode, Matti and Wouter are joined by John Hughes. John is one of the authors of the original Haskell Report and talks about why functional programming matters, the origins of QuickCheck testing, and how higher order functions and lazy evaluation is the key that makes functional programming so productive, and so much fun!

  • jaror@kbin.socialOP
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    1 year ago

    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.

    • l'empathie mécanique@qoto.org
      link
      fedilink
      arrow-up
      0
      ·
      1 year ago

      @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@kbin.socialOP
        link
        fedilink
        arrow-up
        1
        ·
        1 year ago

        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.

        • l'empathie mécanique@qoto.org
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          @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 😅

        • Boyd Stephen Smith Jr.@hachyderm.io
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          @jaror @dpwiz@qoto.org 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@kbin.socialOP
            link
            fedilink
            arrow-up
            1
            ·
            1 year ago

            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.

            • Boyd Stephen Smith Jr.@hachyderm.io
              link
              fedilink
              arrow-up
              1
              ·
              1 year ago

              @jaror @dpwiz@qoto.org 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@kbin.socialOP
                link
                fedilink
                arrow-up
                1
                ·
                1 year ago

                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?