Hos*_*ork 4 haskell language-lawyer
我注意到这在Haskell中是不合法的:
foo :: [a] -> [a]
foo [] = []
bar = 3
foo (x:xs) = x : foo xs
Run Code Online (Sandbox Code Playgroud)
但是,这是:
foo :: [a] -> [a]
bar = 3
foo [] = []
foo (x:xs) = x : foo xs
Run Code Online (Sandbox Code Playgroud)
虽然函数匹配的模式必须全部组合在一起,但类型签名似乎可以漂移.但到目前为止?我被告知它必须处于相同的"块"......但从技术上讲,究竟什么是"块"?
除了声明可以按任何顺序出现在文件中之外,每个函数的声明必须在一起.
请注意,定义函数的所有子句必须是连续的,并且每个子句中的模式数必须相同.对应于每个匹配的模式集必须是线性的 - 不允许变量在整个集合中出现多次.
您有四个顶级声明:
宣言 bar
bar = 3
Run Code Online (Sandbox Code Playgroud)
两个声明 foo
foo [] = []
foo (x:xs) = x : foo xs
Run Code Online (Sandbox Code Playgroud)
一个类型签名 foo
foo :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
除了函数绑定的连续声明之外,这些声明可以在同一文件中以任何顺序彼此保持任何距离,并且仍具有相同的含义.
let并where引入非顶级声明.在这些声明范围中,除了函数的连续声明之外,声明可以按任何顺序发生,但仍具有相同的含义.在不同范围内做出的声明不一定具有相同的含义.范围在Haskell报告的表达式部分的 3.12节表达式中描述
让表达式具有一般形式
let { d1 ; ... ; dn } in e,并引入嵌套的,词法范围的,相互递归的声明列表(let通常letrec在其他语言中调用).声明的范围是声明的表达e和右侧.声明在第4章中描述.
除了功能绑定和图案绑定,一个let或where也可以引入式签名和固定性声明.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |