gpt4 book ai didi

haskell - Haskell中的 'block'粒度是如何定义的?

转载 作者:行者123 更新时间:2023-12-04 03:54:25 25 4
gpt4 key购买 nike

我注意到这在 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

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

最佳答案

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

declarations section of the Haskell report ,在第 4.4.3.1 节函数绑定(bind)中,说

Note that all clauses defining a function must be contiguous, and the number of patterns in each clause must be the same. The set of patterns corresponding to each match must be linear---no variable is allowed to appear more than once in the entire set.



您有四个顶级声明:
bar 的声明
bar = 3
foo 的两个声明
foo [] = []
foo (x:xs) = x : foo xs
foo 的类型签名
foo :: [a] -> [a]

除了函数绑定(bind)的连续声明外,它们在同一个文件中可以按任意顺序彼此相距任意距离,并且仍然具有相同的含义。

让在哪里
letwhere还引入了非顶级声明。在这些声明范围内,除了函数的连续声明外,声明可以以任何顺序出现,并且仍然具有相同的含义。不同范围内的声明不一定具有相同的含义。 expressions sections of the Haskell report 中描述了范围。 ,在第 3.12 节让表达式

Let expressions have the general form let { d1 ; ... ; dn } in e, and introduce a nested, lexically-scoped, mutually-recursive list of declarations (let is often called letrec in other languages). The scope of the declarations is the expression e and the right hand side of the declarations. Declarations are described in Chapter 4.



除了函数绑定(bind)和模式绑定(bind), letwhere还可以引入类型签名和固定性声明。

关于haskell - Haskell中的 'block'粒度是如何定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24978563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com