Ron Toland
About Canadian Adventures Keeping Score Archive Photos Replies Also on Micro.blog
  • Seven More Languages in Seven Weeks: Elm

    Between the move and the election and the holidays, took me a long time to finish this chapter.

    But I’m glad I did, because Elm is – dare I say – fun?

    The error messages are fantastic. The syntax feels like Haskell without being as obtuse.  Even the package management system just feels nice.

    A sign of how much I liked working in Elm: the examples for Day Two and Three of the book were written for Elm 0.14, using a concept called signals. Unfortunately, signals were completely removed in Elm 0.17 (!). So to get the book examples working in Elm 0.18, I had to basically rebuild them. Which meant spending a lot of time with the (admittedly great) Elm tutorial and trial-and-erroring things until they worked again.

    None of which I minded because, well, Elm is a great language to work in.

    Here’s the results of my efforts:

    • Day Two
    • Day Three
    And here's what I learned:

    Day One

    • haskell-inspired
    • elm-installer: damn, that was easy
    • it's got a repl!
    • emacs mode also
    • types come back with all the values (expression results)
    • holy sh*t: "Maybe you forgot some parentheses? Or a comma?"
    • omg: "Hint: All elements should be the same type of value so that we can iterate through the list without running into unexpected values."
    • type inferred: don't have to explicitly declare the type of every variable
    • polymorphism via type classes
    • single-assignment, but the repl is a little looser
    • pipe syntax for if statement in book is gone in elm 0.17
    • case statement allows pattern matching
    • case statement needs the newlines, even in the repl (use `\`)
    • can build own complex data types (but not type classes)
    • case also needs indentation to work (especially if using result for assignment in the repl)
    • records: abstract types for people without beards
    • changing records: use `=` instead of `<-`: { blackQueen | color = White }
    • records look like they're immutable now, when they weren't before? code altering them in day one doesn't work
    • parens around function calls are optional
    • infers types of function parameters
    • both left and right (!) function composition <| and |>
    • got map and filter based off the List type (?)
    • no special syntax for defining a function versus a regular variable, just set a name equal to the function body (with the function args before the equal sign)
    • head::tail pattern matching in function definition no longer works; elm is now stricter about requiring you to define all the possible inputs, including the empty list
    • elm is a curried language (!)
    • no reduce: foldr or foldl
    • have to paren the infix functions to use in foldr: List.foldr (*) 1 list
    • hard exercise seems to depend on elm being looser than it is; afaict, it won't let you pass in a list of records with differing fields (type volation), nor will it let you try to access a field that isn't there (another type violation)

    Day Two

    • section is built around signals, which were removed in Elm 0.17 (!)
    • elm has actually deliberately moved away from FRP as a paradigm
    • looks like will need to completely rewrite the sample code for each one as we go...thankfully, there's good examples in the elm docs (whew!)
    • [check gists for rewritten code]
    • module elm-lang/keyboard isn't imported in the elm online editor by default anymore

    Day Three

    • can fix the errors from loading Collage and Element into main by using toHtml method of the Collage object
    • elm-reactor will give you a hot-updated project listening on port 8000 (so, refresh web page of localhost:8000 and get updated view of what your project looks like)
    • error messages are very descriptive, can work through upgrading a project just by following along (and refreshing alot)
    • critical to getting game working: https://ohanhi.github.io/base-for-game-elm-017.html (multiple subscriptions)
    → 7:00 AM, Jan 30
  • RSS
  • JSON Feed
  • Surprise me!