Haskell 中的“块”粒度是如何定义的?

2023-12-01

我注意到这在 Haskell 中是不合法的:

foo :: [a] -> [a]
foo [] = []

bar = 3

foo (x:xs) = x : foo xs

然而,这是:

foo :: [a] -> [a]

bar = 3

foo [] = []
foo (x:xs) = x : foo xs

尽管与函数匹配的模式必须全部组合在一起作为一个集合,但类型签名似乎可能会漂移。但有多远呢?有人告诉我它必须在同一个“块”中......但从技术上讲,“块”到底是什么?


每个函数的声明必须在一起,但声明可以以任何顺序出现在文件中。

The Haskell 报告的声明部分,在第 4.4.3.1 节“函数绑定”中,说

请注意,定义函数的所有子句必须是连续的,并且 每个子句中的模式数量必须相同。的集合 每个匹配对应的模式必须是线性的——没有变量 允许在整个集合中出现多次。

您有四个顶级声明:

声明bar

bar = 3

两个声明foo

foo [] = []
foo (x:xs) = x : foo xs

类型签名foo

foo :: [a] -> [a]

除了函数绑定的连续声明之外,这些声明可以在同一文件中以任意顺序彼此间隔任意距离,并且仍然具有相同的含义。

让和在哪里

let and where还引入非顶级声明。在这些声明范围中,除了函数的连续声明之外,声明可以以任何顺序出现,并且仍然具有相同的含义。在不同范围内做出的声明不一定具有相同的含义。范围描述于Haskell 报告的表达式部分,第 3.12 节 Let 表达式

让表达式有一般形式let { d1 ; ... ; dn } in e, 和 引入一个嵌套的、词法范围的、相互递归的列表 声明(let通常被称为letrec其他语言)。这 声明的范围是表达式e和右手边 的声明。声明在第 4 章中进行了描述。

除了函数绑定和模式绑定之外,let or where还可以引入类型签名和固定性声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 中的“块”粒度是如何定义的? 的相关文章

随机推荐