我注意到这在 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(使用前将#替换为@)