Haskell:具有多个***绑定的“where”子句?

Posted

技术标签:

【中文标题】Haskell:具有多个***绑定的“where”子句?【英文标题】:Haskell: “where” clause with multiple top-level bindings? 【发布时间】:2014-10-04 09:55:39 【问题描述】:

这一定是一个常见问题解答,但我在关于letwhere 的大量问题中找不到它,所以……我想从多个***绑定中提取一个表达式,而仅将其范围限定为那些绑定。如果我有一个带有“where”子句的单一绑定,我可以这样做:

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

如果我对同一个***绑定有多个受保护的方程式:

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

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

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

我也必须在顶层定义bar。这没什么大不了的,但是更仔细地确定范围会很好。我错过了什么吗?谢谢!

【问题讨论】:

【参考方案1】:

您并没有遗漏什么,只是 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)

【讨论】:

以上是关于Haskell:具有多个***绑定的“where”子句?的主要内容,如果未能解决你的问题,请参考以下文章

具有 haskell GLUT 绑定的透明度/Alpha

Idris——类似Haskell的纯函数编程语言

带有 Haskell 梁的简单 where 子句的类型错误

Haskell - 在“where”中定义一个带有守卫的函数

在 Haskell 中使用嵌套的 `where` 子句

`where` 子句在 Haskell 中在哪里派上用场