在哪里,让Haskell范围,

时间:2013-12-10 11:51:20

标签: haskell scope where-clause let

我想在以下where子句中访问let-binding。

为什么此代码失败? 更重要的是:我如何让它发挥作用?

test bar = let baz = bar - 1 in
 foo where
  foo = baz`
它说: 不在范围内:baz' Perhaps you meant bar'

2 个答案:

答案 0 :(得分:3)

您可以将 where 视为另一种在属于单个匹配的右侧编写 let 的方法。

在你的情况下,它很容易,因为只有一个右手边。因此,你写道:

test bar = let foo = baz in let baz = bar-1 in foo

这不起作用。我建议坚持使用 ,大多数惯用语都是:

test bar = foo
    where
       foo = baz
       baz = bar -1

除此之外,当您只定义baz时,baz'将永远不在范围内。

答案 1 :(得分:0)

where子句只能访问封闭函数的参数和任何更高级别的绑定。您可以将baz作为参数传递给foo

test bar = let baz = bar - 1 in (foo baz)
  where foo x = x