
On Wed, Feb 16, 2011 at 11:49 AM, Dmitry Kurochkin
On Wed, 16 Feb 2011 06:25:54 +0200, Michael Snoyman
wrote: It looks good. Instead of the mkSize TH function, if you just define an IsString instance, then anyone using OverloadedStrings will be able to use string literals. I haven't confirmed this yet, but it might even be possible to embed those string literals inside Cassius and GHC will still apply fromString appropriately.
I was thinking about it. But as I understand, it would not work unless you explicitly specify the resulting size type. E.g.
let s = fromString "100px"
How would GHC know that in this case fromString for PixelSize should be used? This would force you to add explicit (s :: PixelSize) type. This is something I want to avoid: Type should be determined from string constant. Or am I missing something?
No, you're right, TH is the way to go here.
As far as variables inside templates: I personally think that's crossing the line again into stuff templates shouldn't be dealing with, but I'm open for discussions. Since templates tie in so well with Haskell, I just don't think it's worth adding a whole bunch of extra code and syntax to make it work.
I understand this is a feature which may be used inappropriately. But here is mine justification for it:
Consider you want to write a simple Cassius template:
#a height: 100px #b width: 100px
#a and #b are related and their width and height should be always the same. So it makes perfect sense to define (commonSize = $(mkSize "100px")) and use it instead of literals. I know that commonSize is needed and used only for that Cassius template, but I have to define it in an external Haskell module. That makes template not self-contained and harder to read, pollutes Haskell code with declarations that should be local to a template. IMO this cases illustrates how local template variables may be the right solution:
#{let commonSize = $(mkSize "100px")} #a height: #{commonSize} #b width: #{commonSize}
Actually, I think this code snippet proves the opposite point. It's not really possible to embed TH in a template. I think adding in a whole bunch of Haskell features to Cassius (et al) will simply start people wishing they *were* programming in Haskell instead of templates. My opinion: keep the templates simple and to the point, put the logic in Haskell where you have more power. Michael