Haskell:使拟报价的值严格/在编译时评估

问题描述 投票:3回答:1

我有一个'Month'类型,大致来说

newtype Month = Month Word8

Month构造函数未导出的地方;而是一个功能

mon :: Word8 -> Maybe Month
mon i = if i > 0 && i < 13
        then Just $ Month i
        else Nothing

已导出,仅当输入值在1和12之间(包括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|]

__fromString解析字符串,然后返回值或调用errorforce来自Control.DeepSeq

现在,这很好,但是它的主要价值是尽早发现不好的值-但是,由于采用了惰性求值,因此在编译时也不对值m进行求值(这很理想,但是也许是一个相当高的要求),或者至少在运行时的最早阶段。

有什么方法可以注释该值(最好在下面的准引号内,以便每次使用month都可以免费获取它;但如果失败,请注释m)以强制评估[C0 ]该程序何时运行?需要m约束或类似约束即可。

谢谢,

haskell lazy-evaluation template-haskell quasiquotes
1个回答
0
投票

您的准报价商只需将所有内容放在引号中即可将所有内容推迟到运行时。您需要将解析和验证移到引号之外。

© www.soinside.com 2019 - 2024. All rights reserved.