模块声明中where关键字的含义

时间:2011-09-07 23:28:49

标签: haskell

我正在学习Haskell并阅读这本书,Learn You a Haskell for Great Good!

当作者谈到where关键字时,他说:

  

在命令式编程语言中,您可以通过以下方式解决此问题   将计算结果存储在变量中。在这个部分,   您将学习如何使用Haskell的关键字来存储结果   中间计算,提供类似的功能。

但是我在模块声明结束时也看到了where关键字,我怀疑这个场景中的“中间计算”解释是什么,在模块声明结束时所遵循的含义是什么?

3 个答案:

答案 0 :(得分:3)

foo = baz
    where
    baz = 1
    quux = 2
    ...

比较

module Foo 
    where
    baz = 1
    quux = 2
    ...

where充当定义范围的句法介绍人。但是,我认为这只是一个伎俩,因为我们不能说:

let baz = 1
    quux = 2
in module Foo

module Foo

(也许后者是合法的)。我想说module声明在声明的范围内输出(除非另有说明)范围内的所有符号;这将是最一致的。但它是错误的,所以我们可以充分考虑它的具体语法的特殊性。我认为很长一段时间都很奇怪(并且在进一步反思时回答这个问题,仍然这样做。)

答案 1 :(得分:2)

最基本的是,where引入了一个新的范围。这也是模块顶部的含义:介绍模块定义的范围。

答案 2 :(得分:1)

这只是命名模块语法的一部分,如果您希望其他文件能够导入模块,这是必需的。语法是

module ModuleName (functions and datatypes to export) where

括号是可选的,包含您希望模块用户可以使用的函数和数据类型的名称。导入模块时,不会导入它们之间未列出的任何内容。如果选择省略括号,则将导出所有函数和数据类型。