什么';这是本例中“in”关键字的含义(F#)

什么';这是本例中“in”关键字的含义(F#),f#,keyword,F#,Keyword,我一直在尝试了解F#的各个方面(我来自C#背景),我对解析器很感兴趣,因此我跳到了这篇关于F#解析器组合器的博客文章: 这里的一个样本是: /// If the stream starts with c, returns Success, otherwise returns Failure let CharParser (c: char) : Parser<char> = let p stream = match stream with |

我一直在尝试了解F#的各个方面(我来自C#背景),我对解析器很感兴趣,因此我跳到了这篇关于F#解析器组合器的博客文章:

这里的一个样本是:

/// If the stream starts with c, returns Success, otherwise returns Failure
let CharParser (c: char) : Parser<char> =
    let p stream =
        match stream with
        | x::xs when x = c -> Success(x, xs)
        | _ -> Failure
    in p               //what does this mean?
///如果流以c开头,则返回Success,否则返回Failure
let CharParser(c:char):解析器=
让p流=
匹配流
|x::x=c时xs->成功(x,xs)
|故障
在p/中,这是什么意思?
然而,让我对这段代码感到困惑的是p语句中的
。我在MSDN文档中的
关键字中查找了

我还发现了前面的问题:


这两种用法似乎都不一样。唯一适合的是这是一个流水线结构。

The
let x=。。。在expr中
允许您为某个变量
x声明绑定,然后可以在expr中使用该变量

在这种情况下,
p
是一个函数,它接受一个参数
stream
,然后根据匹配结果返回
Success
Failure
,该函数由
CharParser
函数返回

F#自动嵌套
let。。在
绑定中,例如

let x = 1
let y = x + 2
y * z

let x = 1 in
let y = x + 2 in
y * z
因此,此处不需要中的
,函数可以简单地编写为

let CharParser (c: char) : Parser<char> =
    let p stream =
        match stream with
        | x::xs when x = c -> Success(x, xs)
        | _ -> Failure
    p
let CharParser(c:char):解析器=
让p流=
匹配流
|x::x=c时xs->成功(x,xs)
|故障
P

Lee的回答解释了这个问题。在F#中,
中的
关键字是从早期函数式语言继承而来的,这些函数式语言激发了F#的灵感,并需要F#,即从ML和OCaml继承而来

可能值得补充的是,在F#中只有一种情况,您仍然需要在
中使用——也就是说,当您要编写
时,让
在一行上后跟一个表达式。例如:

let a = 10
if (let x = a * a in x = 100) then printfn "Ok"
这是一种有点时髦的编码风格,我通常不会使用它,但是如果你想这样写的话,你确实需要在中加入
。但您始终可以将其拆分为多行:

let a = 10
if ( let x = a * a
     x = 100 ) then printfn "Ok"

谢谢,虽然代码布局略有不同,但它与我链接到的问题是相同的用例。是的,in的使用并不能使它更具可读性。我认为在您的示例中,如果(a*a=100)执行类似于
的操作,那么printfn“Ok”
将实现相同的效果?