Made with KolourPaint and screenshots from Kate (with the GitHub theme).

  • HiddenLayer555@lemmy.mlOP
    link
    fedilink
    English
    arrow-up
    2
    ·
    edit-2
    17 hours ago

    How do you do nested parameterized types without it becoming ambiguous though? That’s IMO the biggest advantage of the bracket syntax. For example: Map<Tuple<Int, Int, Int> Int>

    • barsoap@lemm.ee
      link
      fedilink
      arrow-up
      4
      ·
      17 hours ago

      Map (Int, Int) Int. Kind of a bad example because tuples have special-case infix syntax, the general case would be Map Int (Either Int Bool). Follows the same exact syntax as function application just that types (by enforced convention) start upper case. Modulo technical wibbles to ensure that type inference is possible you can consider type constructors to be functions from types to types.

      …function application syntax is a story in itself in Haskell because foo a b c gets desugared to (((foo a) b) c): There’s only one-argument functions. If you want to have more arguments, accept an argument and return a function that accepts yet another argument. Then hide all that under syntactic sugar so that it looks innocent. And, of course, optimise it away when compiling. Thus you can write stuff like map (+5) xs in Haskell while other languages need the equivalent of map (\x -> x + 5) xs (imagine the \ is a lambda symbol).