haskell IHP中的标签过载

6yoyoihd  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(137)

上下文

《IHP指南》中有一节描述了他们对散列符号的使用:
https://ihp.digitallyinduced.com/Guide/helpful-tips.html
它提到以下内容:
写入#companyId相当于写入fromLabel @"companyId"

实验

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

{get #title 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"
flvlnr44

flvlnr441#

更新:此问题已在IHP v0.20中修复,现在可按预期工作

这是一个已知的错误:-)
请参阅https://github.com/digitallyinduced/ihp/issues/1049https://github.com/digitallyinduced/ihp/issues/857
试着这样写:

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

在HSX表达式中,{}中的haskell代码是使用自定义haskell解析器(不是haskell编译器使用的解析器)解析的。自定义解析器有点过时,还不支持@SomeType语法。
解析器也不直接支持#hash语法。解析器认为#符号是中缀运算符(如+-)。HSX随后将带有#的中缀表达式转换为正确的fromLabel调用。
有了haskell编译器的最新版本,我们实际上可以完全摆脱第三方解析器,直接使用haskell编译器的解析器。我们计划在未来这样做来解决这个问题。

相关问题