我正在尝试在Haskell中编写CSS DSL,并使语法尽可能接近CSS.一个困难是某些术语既可以作为财产也可以作为价值出现.例如flex:你可以在CSS中使用"display:flex"和"flex:1".
我让自己激发了Lucid API,它基于函数参数覆盖函数,以生成属性或DOM节点(有时也共享名称,例如<style>和<div style="...">).
无论如何,我遇到了一个问题,即GHC未能检查代码(Ambiguous类型变量),在一个应该选择两个可用类型类实例之一的地方.只有一个实例适合(实际上,在类型错误GHC打印"这些潜在的实例存在:"然后它只列出一个).我很困惑,考虑到单个实例的选择,GHC拒绝使用它.当然,如果我添加显式类型注释,那么代码将编译.下面的完整示例(对于Writer,只有依赖项是mtl).
{-# LANGUAGE FlexibleInstances #-}
module Style where
import Control.Monad.Writer.Lazy
type StyleM = Writer [(String, String)]
newtype Style = Style { runStyle :: StyleM () }
class Term a where
term :: String -> a
instance Term String where
term = id
instance Term (String -> StyleM ()) where
term property value = tell [(property, value)]
display :: String -> StyleM ()
display = term "display"
flex :: Term a => …Run Code Online (Sandbox Code Playgroud) 我正在为Haddock制作一个新的主题,并希望在一些真实的项目中尝试它.如何配置堆栈以使用我的haddock可执行文件?我没有在stack.yaml中看到任何配置选项.我也尝试将新的haddock可执行文件放入我的PATH,但这没有用.
我有一些绑定,我想保持一个函数的私有(所以,没有在顶级模块命名空间中声明),但是计算成本很高,所以我更喜欢它们是CAF.是否有一个pragma或其他一些技巧可以用来迫使GHC为这些绑定分配CAF?
示例代码:
header :: HeaderProps -> Element
header = div_ [style_ headerStyle] [str_ "Here be headerz"]
where
-- Creating the 'headerStyle' is expensive! Do it only once
-- regardless of how many times the 'header' function is used.
headerStyle = mkStyle $ do
display flex
flexDirection column
padding (px 20) (px 40)
Run Code Online (Sandbox Code Playgroud)
如果那是不可能的,我会看到一些选项,但每个选项都有其自身的缺点:
headerStyle- > header__headerStyle).TemplateHaskell卸载昂贵的计算编译时.