我有一个“月”类型,大致是
newtype Month = Month Word8
Month
没有导出构造函数的地方;相反,一个函数
mon :: Word8 -> Maybe Month
mon i = if i > 0 && i < 13
then Just $ Month i
else Nothing
被导出,仅当输入值介于 1 和 12 之间时才会返回一个值。
现在,使用Language.Haskell.TH.Quote
,我定义了一个准引用 ... 运算符?...这允许我“在编译时”“创建” Month 的实例:
month :: QuasiQuoter
month = QuasiQuoter { quoteDec = error "quoteDec not implemented"
, quoteType = error "quoteType not implemented"
, quotePat = "quotePat not implemented"
, quoteExp = (\ s → ⟦ force $ __fromString @Month s ⟧)
}
m :: Month
m = [month|3|]
Where__fromString
解析一个字符串,并返回一个值或调用error
. force
是从Control.DeepSeq
。
现在这很好,但它的主要价值是尽早捕获坏值 - 但是,由于延迟评估,值 m 也不会在编译时评估(这将是理想的,而是也许是高阶)或至少在运行时的最早阶段。
有什么方法可以注释该值(最好在下面的准引用中,以便每次使用month
都可以免费获得它;但如果失败,则注释m
)以强制评估m
程序何时运行?要求NFData
约束或类似的很好。
谢谢,