我正在学习F#,到目前为止我很享受.几乎所有在线示例都使用轻量级语法(#light); 但是,在大多数情况下,也会对所述示例进行评论.
使用#light启用还是禁用来学习F#会更好吗?我打算最终学习它没有开启,但我很好奇是否在开始学习它或者在我更熟悉核心语言之后应用它.
我一直试图了解F#的各个部分(我来自更多的C#背景),解析器对我很感兴趣,所以我跳过关于F#解析器组合器的博客文章:
http://santialbo.com/blog/2013/03/24/introduction-to-parser-combinators
其中一个样本是:
/// 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?
Run Code Online (Sandbox Code Playgroud)
但是,这个代码让我感到困惑的一件事就是in p声明.我in在MSDN文档中查找了关键字:
http://msdn.microsoft.com/en-us/library/dd233249.aspx
我也发现了这个早先的问题:
这些似乎都没有相同的用法.唯一合适的是这是一个流水线构造.
这个问题在stackoverflow中并不新鲜,但我无法理解let与模式和in关键字绑定的行为.我的教科书更喜欢不常见的函数定义格式:
let foo = fun x -> let f = (fun x y -> x +y ) in f x
Run Code Online (Sandbox Code Playgroud)
所以我翻译了#light语法:
let foo x =
let f y =
x + y
f x
Run Code Online (Sandbox Code Playgroud)
如果我设置foo 4它返回我8.为什么?我无法理解函数内部实际发生了什么,即使这里有优雅的解释.为什么4成为双方争论x和y?
基于“F#中关键字“in”的含义”的回答:
let (x = 2 and y = x + 2) in
y + x
Run Code Online (Sandbox Code Playgroud)
这不会像
let (x = 2 and y = x + 2)
y + x
Run Code Online (Sandbox Code Playgroud)
在前一种情况下x,只绑定在in关键字之后。在后一种情况下,正常的变量作用域规则生效,因此变量一经声明就被绑定。
当需要使用 , 指定绑定变量in而不是声明时绑定?
我正在阅读关于RosettaCode的示例,并且不完全知道以下行正在做什么.
let min,subheap = findMin heap' in let rtn = root topnode
Run Code Online (Sandbox Code Playgroud)
它似乎findMin heap'是自包含的执行单元.我不知道它与"in"运算符的关系,也不了解在"in"运算符中使用let语句.
这是整个方法
let rec private findMin heap =
match heap with | [] -> raise Empty_Heap //guarded so should never happen
| [node] -> root node,[]
| topnode::heap' ->
let min,subheap = findMin heap' in let rtn = root topnode
match subheap with
| [] -> if rtn.k > min.k then min,[] else rtn,[]
| minnode::heap'' ->
let rmn = root minnode
if …Run Code Online (Sandbox Code Playgroud)