by Marc Scholten, 20.12.2020
The quality of GHC's error messages is making it harder for newcomers to adopt Haskell. A good error message should be clear, actionable, and practical. In this aspect GHC could be a lot more user-friendly.
Here's an example related to type-level-list syntax that often comes up in the IHP community:
action CreateUserAction = do let user = newRecord @User let password = param @Text "password" user |> set #passwordHash password |> fill @["email"] |> validateField #email isEmail |> validateField #passwordHash nonEmpty |> debug |> ifValid \case Left user -> render NewView {..} Right user -> do hashed <- hashPassword (get #passwordHash user) user |> set #passwordHash hashed |> createRecord setSuccessMessage "You have successfully registered"
This code snippet errors with:
Web/Controller/Users.hs:16:23 * Expected a type, but `"email"' has kind `Symbol' * In the type `["email"]' In the second argument of `(|>)', namely `fill @["email"]' In the first argument of `(|>)', namely `user |> set #passwordHash password |> fill @["email"]' | 16 | |> fill @["email"] | ^^^^^^^
Unless you know about the type-level-list syntax issue with '
you will most likely get stuck.
A better error message could offer a solution that will most likely help:
Web/Controller/Users.hs:16:23 * Type level lists with only a single element need a ' in front of the list. Prepend a ' like `'["email]' to get it working. * In the type `["email"]' In the second argument of `(|>)', namely `fill @["email"]' In the first argument of `(|>)', namely `user |> set #passwordHash password |> fill @["email"]' | 16 | |> fill @["email"] | ^^^^^^^
We've collected a couple more real-world issues on GitHub with possible better alternatives.
I'd like to start a discussion in the larger haskell community on this so we can find a process on how we can improve this longterm. E.g. maybe we could have a central repository where haskell users could report bad and unclear error messages.
There's haskell/rfcs for new GHC features, so why don't we have a repository like haskell/ux
where we can collect ideas to improve existing features?
Let me know what you think about this on GitHub or Reddit.