小册子模板和$ forall中的数据解构:为什么它不会将解构成员带入范围?

时间:2013-10-02 18:12:02

标签: haskell yesod hamlet

在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

任何想法为什么使用解构语法都无法将项目纳入范围?

1 个答案:

答案 0 :(得分:4)

你的解构语法错了。试试这个:

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

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

data Foo a = Foo a Int Int

它更自然地解构:

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