Haskell:“where”子句有多个顶级绑定?

时间:2014-08-11 14:19:20

标签: haskell

这必须是一个常见问题解答,但我无法在关于let vs where的一系列问题中找到它,所以...我想将一个表达式排除在多个顶部之外级别绑定,同时仅限于那些绑定。如果我有一个带有“where”子句的单个绑定,我可以这样做:

foo = ... bar ... bar ...
    where bar = ...

并且如果我有相同顶级绑定的多个保护等式:

foo = x | ... bar ...
        | ... bar ...
    where bar = ...

但似乎没有办法在“where”的范围内有多个顶级绑定,就像这样:

foo = ... bar ...
baz = ... bar ...
    where bar = ...

我也必须在顶层定义bar。这不是什么大不了的事,但更贴近它的范围会更好。我错过了什么吗?谢谢!

1 个答案:

答案 0 :(得分:5)

您不会遗漏某些内容,只是where仅适用于单个表达式。因此,在第一个示例中,您只有一个表达式,在第二个示例中,单个表达式是您的守护,在第三个示例中,您有两个不同的表达式。作为参考,您可以看到Haskell 98语法here的技术说明,但相关部分是

rhs    ->  = exp [where decls]
       |   gdrhs [where decls]

其中声明定义的右侧可以包含带有声明的可选where的表达式,或带有声明的可选where的保护右侧。

如果您需要使用两个功能进行绑定,则必须在同一范围内对其进行定义,这就是它的工作原理。


但是有一种解决方法。你可以做点什么

foo :: Int
bar :: String
(foo, bar) = (2 * baz, show baz)
    where baz = 1

但我个人更希望在顶层看到baz,而不是在顶层定义(foo, bar)