【问题标题】:hamlet templates and deconstructing data in $forall : why it doesn't bring deconstructed members in scope?$forall 中的 hamlet 模板和解构数据:为什么它不将解构成员纳入范围?
【发布时间】:2013-10-02 18:12:01
【问题描述】:

在 Yesod 中,在路由处理程序中使用 whamletFile 函数时,我在 $forall 构造中解构记录时遇到问题。

我有这个数据记录:

data Foo a = Foo (a, Int, Int)

在 hamlet 模板文件中,我遍历 [Foo] 的一个实例并尝试使用解构语法:

$forall (Foo (a, b, c)) <- foos
  <li>#{a}

编译时出现此消息Not in scope: 'a' 失败

虽然这不会失败并且会适当地处理 forall 构造:

$forall (Foo (a, b, c)) <- foos
  <li>nothing special

知道为什么使用解构语法无法将项目纳入范围吗?

【问题讨论】:

    标签: haskell yesod hamlet


    【解决方案1】:

    您的解构语法错误。试试这个:

    $forall Foo (a, b, c) <- foos
        <li>#{a}
    

    此外,您的数据声明实际上声明了一个具有一个字段的类型 - 一个元组。如果你想声明一个包含 3 个字段的类型,你的语法应该不同:

    data Foo a = Foo a Int Int
    

    它更自然地解构:

    $forall Foo a b c <- foos
        <li>#{a}
    

    【讨论】:

    • 我想我很可能是因为不正确的缩进而绊倒了,但未能将它带入编辑框中。感谢您提到我可能会误用元组而不是单独的字段,也就是说,当放入的值是具有多个术语 Foo 的表达式时,元组更容易构造(但不是解构)(某事 a,某事 b , something c) 与 Foo (something a) (something b) (something c) 相比,但我会记住用位置值定义这些记录的更自然的方式。
    猜你喜欢
    • 2011-11-18
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2011-07-13
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多