将函数中的新值绑定到已命名的名称(标识符)?

时间:2013-10-28 22:11:11

标签: f# f#-3.0

在“专家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都是某种其他东西,但功能不同仍然使用那个名字!

我的问题是:parseIndexsrc真正做了什么?因为在第二个模式匹配中,它使用src就好像它是tryToken给出的deffirent值,但是看看tryToken,我发现它应该在每次使用模式时给出相同的结果 - 匹配。

您看到的HatIntToken的联合案例,type TokenStream = Token list

2 个答案:

答案 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
...

范围的其余部分只会看到最后一个。