能否为Hamlet模板中的$case表达式配置-Wincomplete-patterns警告?
Hamlet模板$case表达式的不完整模式警告设置
默认情况下,Hamlet模板中的$case表达式无法直接触发GHC的-Wincomplete-patterns警告——因为$case是模板层的语法,其模式匹配逻辑会被模板预处理器转换为Haskell代码,但转换过程不会保留GHC警告的触发条件,GHC不会对模板内的$case模式匹配做不完整性检查。
不过可以通过间接方式实现类似效果:
将模式匹配逻辑迁移到Haskell代码中:把原本在模板里的
$case分支逻辑,封装成普通的Haskell函数,在函数里完成模式匹配。这样GHC的-Wincomplete-patterns就能正常对这个函数的模式匹配进行检查,一旦有遗漏分支就会抛出警告,之后在Hamlet模板里调用这个函数即可。举个例子:
原本模板里的代码可能是:$case maybeUser of Just user -> <p>Hello #{userName user} Nothing -> <p>Guest可以改成在Handler里定义函数:
renderUser :: Maybe User -> Html renderUser (Just user) = [shamlet|<p>Hello #{userName user}|] renderUser Nothing = [shamlet|<p>Guest|]然后模板里调用:
^{renderUser maybeUser}这样如果
renderUser的模式匹配有遗漏,GHC就会触发-Wincomplete-patterns警告。
这种方法既利用了GHC成熟的警告机制,也保持了模板的简洁性,是最常用的解决方案。
内容的提问来源于stack exchange,提问作者Sergiu Starciuc
相关产品推荐
相关产品推荐

