IHP 中的重载标签

OverloadedLabels in IHP

上下文

IHP 指南中有一节描述了它们对井号的使用:

https://ihp.digitallyinduced.com/Guide/helpful-tips.html

它提到了以下内容:

Writing #companyId is equivalent to writing fromLabel @"companyId".

实验

在示例博客应用程序中,如果我将以下内容添加到视图:

{get #title post}

post 的标题按预期显示。

现在,如果我将以下内容添加到视图中:

{get (fromLabel @"title") post}

该页面无法正确呈现,并显示以下消息:

Web/View/Posts/Show.hs:11:33
    • 12:40:
   |
12 |         {get (fromLabel @"title") post}
   |                                        ^
"0\nSrcLoc \"\" 1 30\nParse error in expression: fromLabel@\"title\"\n"

问题

根据上面引用的文档中提到的内容,我似乎可以写:

get (fromLabel @"title") post

而不是:

get #title post

但这显然行不通。 :-)

那么,我在这里缺少什么?有没有办法写:

get #title post

根据fromLabel?

更新 1

按照 Fyodor 在下面评论中的建议,我尝试了以下操作:

{show @Int 42}

这是结果:

Web/View/Posts/Show.hs:11:33
    • 12:23:
   |
12 |         {show @Int 42}
   |                       ^
"0\nSrcLoc \"\" 1 13\nParse error in expression: show@Int\n"

这是一个已知错误:-)

https://github.com/digitallyinduced/ihp/issues/1049 and https://github.com/digitallyinduced/ihp/issues/857

试试这样写:

[hsx|{title}|]
    where
        title = get (fromLabel @"title") post

在 HSX 表达式中,{} 中的 haskell 代码使用自定义 haskell 解析器(不是 haskell 编译器使用的解析器)进行解析。自定义解析器有点过时并且还不支持 @SomeType 语法。

解析器也不直接支持 #hash 语法。解析器认为 # 符号是中缀运算符(如 +-)。 HSX 随后将带有 # 的中缀表达式转换为正确的 fromLabel 调用。

使用最新版本的 haskell 编译器,我们实际上可以完全摆脱第三方解析器并直接使用 haskell 编译器解析器。我们计划在未来这样做以解决此问题。