1

在“Expert 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,但是查看 tryToken,我发现它应该在每次使用模式匹配时给出相同的结果。

HatInt你看到的是联合案例,Tokentype TokenStream = Token list

4

2 回答 2

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
于 2013-11-02T12:52:12.560 回答
1

以后的绑定会隐藏或隐藏较早的绑定。您可以根据需要绑定任意x多次:

let x = 1
let x = 2
let x = 3
...

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

于 2013-10-28T22:14:33.613 回答