Haskell: “where” 子句具有多个顶级绑定(bind)?

标签 haskell

这一定是一个常见问题解答,但我在关于 letwhere 的大量问题中找不到它,所以......我想考虑一个表达式脱离多个顶级绑定(bind),同时将其范围仅限于这些绑定(bind)。如果我有一个带有“where”子句的绑定(bind),我就可以做到这一点:

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

如果我对同一顶级绑定(bind)有多个 protected 方程:

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

但似乎无法在“where”范围内拥有多个顶级绑定(bind),如下所示:

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

我也必须在顶层定义bar。这不是什么大不了的事,但如果能更仔细地考虑一下就更好了。我错过了什么吗?谢谢!

最佳答案

您没有遗漏什么,只是 where 仅适用于单个表达式。因此,在第一个示例中,您只有一个表达式,在第二个示例中,单个表达式是您的防护,在第三个示例中,您有两个不同的表达式。作为引用,可以查看Haskell 98语法的技术说明here ,但相关部分是

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

这表明定义的右侧可以由带有可选 where 和声明的表达式组成,或者由带有可选 where 的保护右侧组成> 带有声明。

如果您需要具有两个函数的绑定(bind),则必须在同一范围内定义它,这就是它的工作原理。

<小时/>

不过,有一个解决方法。你可以做类似的事情

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

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

关于Haskell: “where” 子句具有多个顶级绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245516/

相关文章:

haskell - 奇怪的波形符语法

haskell - 实际上是 Haskell 中的通用长度函数

haskell - 具有任意 "Constraint aliases"的派生子句?

haskell - 函数内的格式化语句 - 规则?

opengl - Haskell 图形程序关闭过早

haskell - 类型签名缺少适当的绑定(bind) [Haskell]

haskell - 使用foldl计算真实值的数量

python - Python 和 Haskell 上的 Murmurhash 2 结果

haskell - 如何在不耗尽垃圾收集器的情况下将非常大的元素保留在内存中?

haskell - fromInteger 如何工作?