在“专家F#3.0”一书中,有一个“lex”和“parse”多项式表达式的文本解析示例。我试图理解它(没有解释编写的代码)我遇到了这样的函数:
let parseIndex src =
match tryToken src with
| Some(Hat,src) ->
match tryToken src with
| Some(Int num,src) -> (num,src)
| _ -> failwith "expected an int after ^"
| _ -> (1,src)
使用函数
let tryToken (src:TokenStream) =
match src with
| head::rest -> Some(head, rest)
| _ -> None
函数parseIndex
使用参数src
并且随着代码的进展多次使用tryToken
,每次返回的src
都是某种其他东西,但功能不同仍然使用那个名字!
我的问题是:parseIndex
在src
真正做了什么?因为在第二个模式匹配中,它使用src
就好像它是tryToken
给出的deffirent值,但是看看tryToken,我发现它应该在每次使用模式时给出相同的结果 - 匹配。
您看到的Hat
和Int
是Token
的联合案例,type TokenStream = Token list
答案 0 :(得分:2)
正如丹尼尔所说,这被称为阴影。
在许多情况下它实际上非常有用;想象一下这个C#函数:
public void DoStuff(string s)
{
var trimmed = s.Trim();
// For the rest of this function, we should use trimmed, but s is
// sadly still in scope :(
}
阴影可以通过隐藏原始变量来解决此问题:
let DoStuff s =
let s = s.Trim()
// Only one 's' is in scope here, and it's trimmed
答案 1 :(得分:1)
以后绑定阴影或隐藏早期绑定。您可以根据需要多次绑定x
:
let x = 1
let x = 2
let x = 3
...
范围的其余部分只会看到最后一个。