[Haskell-cafe] Syntax extension - adding import support to let/where bindings

Edward Z. Yang ezyang at mit.edu
Wed Aug 5 20:29:21 UTC 2015


Hello Oliver,

This should be a relatively straightforward extension to the renamer.
But like others have mentioned, you should still be required to import
anything you're going to use locally at the top-level.  This requirement
makes it clear how instance visibility and dependency analysis should be
done.  Plus, you probably want this anyway:

    import qualified My.Qualified.DSL.CSS as CSS

    ... where import CSS

The suggested semantics are that 'import M' is a new form of binding
(so it is valid in let statements and other situations), which takes
every identifier which is qualified with M and makes them available
unqualified.

As far as taste wise, I'm not sure how much I like or dislike this
syntactic feature.  But it should not be difficult to implement.

Edward

Excerpts from Oliver Charles's message of 2015-08-05 03:28:38 -0700:
> Hi all,
> 
> I'm sure this has come up before, but a quick bit of Googling didn't reveal
> any prior discussions (if you known any, let me know), so I'm kicking off a
> new discussion.
> 
> I find myself wanting to be able to say something like:
> 
> foo = ...
>   where import Something.Specific
> 
> The result would be to import the contents of Something.Specific into the
> scope of foo and its other where bindings, but not import into the rest of
> the module that foo is defined in. As a motivating example, I'm currently
> working on building some HTML in Haskell, and the amount of symbols that
> come into scope is huge, when you have a DSL for both CSS and HTML - the
> real pain point being that you get symbols that often conflict.
> 
> Here's an example of something that doesn't type-check currently
> 
> image =
>   img [ width 50, style [ width (px 50) ] ]
> 
> width here is both a symbol in the HTML DSL and the CSS DSL, but to get
> this to type check I need to write something like
> 
> image =
>   img [ HTML.width 50, style [ CSS.width (CSS.px 50) ] ]
> 
> That's not particularly bad here, the really pain is repeatedly having to
> do this for every single symbol I'm using. I'd prefer to be able to write
> 
> image =
>   let css = let import CSS in [ width (px 50) ]
>   in let import HTML in img [ width 50, style css ]
> 
> This is a little bit of a contrived rewrite, but hopefully it shows you
> what I'd like to be able to do. Please don't fixate too much on this
> example, it's only intended to illustrate the idea. When defining a large
> amount of inline styles I think this pays off - I import once to bring all
> the symbols I need into scope, rather than having to qualify every symbol.
> 
> In reality, it will lead to me writing code like:
> 
> myDocument = html
>   where html =
>           div [ style containerStyle ]
>               [ div [ style rowStyle ] "Hello"
>               , div [ style rowStyle ] "World!" ]
>           where import HTML
>         containerStyle =
>           [ backgroundColor ..., padding ..., margin ... ]
>           where import CSS
>         rowStyle =
>           [ backgroundColor ..., padding ..., margin ... ]
>           where import CSS
> 
> At present the suggestion is a syntax error, so I'm hoping that part won't
> be too controversial.
> 
> Thoughts?
> *ocharles*


More information about the Haskell-Cafe mailing list