IHP框架#标签等效fromLabel写法运行报错问题咨询
问题原因
你遇到的解析错误由两个因素导致:
@符号开头的类型应用语法属于GHC的非默认语法,需要开启TypeApplications语言扩展才能被正常识别,IHP的视图文件默认没有开启该扩展。- 部分旧版本IHP的HSX模板解析器存在缺陷,会自动吞噬
@符号前的空格,即便你写了fromLabel @"title",也会被解析为非法标识符fromLabel@"title",进一步触发解析错误。
IHP文档中提到的#xxx等效于fromLabel @"xxx",指的是语法糖经过IHP模板预处理、编译展开后的最终Haskell代码等效,并不是直接可以在HSX的花括号中写展开后的原始代码。
可行解决方案
方案1:开启扩展适配写法
在当前视图文件的头部(module声明之前)添加两行扩展声明:
{-# LANGUAGE TypeApplications #-} {-# LANGUAGE OverloadedLabels #-}
如果开启后依然报解析错误,说明你使用的IHP版本存在HSX解析的空格吞噬问题,可以给类型参数加括号规避:
{get (fromLabel @("title")) post}
你补充测试的show @Int 42写法也适用该规则,开启TypeApplications扩展后即可正常运行,也可以直接写成{show (42 :: Int)}实现完全相同的效果,不需要用到类型应用语法。
方案2:全版本兼容写法
如果不想修改文件扩展配置,或者方案1依然无法解决问题,可以使用Proxy传参的写法,和get #title post完全等效,兼容所有版本的IHP:
{get (fromLabel (Proxy :: Proxy "title")) post}
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

