F#语法糖

时间:2009-03-05 22:24:46

标签: syntax f#

<#> F#显然包含许多语法糖的东西,当我试图学习它时 - 没有书的帮助 - 我被各种各样的语法所震撼。所有语法糖背后是否隐藏着一种更简单的“核心”语言?是否有一份关于语法糖的备忘单以及它们如何映射到核心语言?

嘿,有没有理由F#需要一个不同的“赋值”运算符来进行函数定义而不是lambda,或者它是一个随机决策?例如“let inc x = x + 1”vs“fun x - &gt; x + 1”

7 个答案:

答案 0 :(得分:6)

大量的F#语法来自OCaml - 许多OCaml程序将在F#中编译和运行,没有任何变化。

良好的起始链接:

http://msdn.microsoft.com/en-us/fsharp/default.aspx

http://en.wikibooks.org/wiki/F_Sharp_Programming

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!887.entry?_c=BlogPart

答案 1 :(得分:4)

除了Brian的链接,我还想将链接传递给我自己的博客系列Why I Love F#,其中包含一些基础知识。

关于你的第二个问题,“let inc x = x + 1”vs“fun x - &gt; x + 1”是表达函数的两种方式,但只有第一个使用赋值运算符。事实上,

let inc x = x + 1

相当于:

let inc = (fun x -> x + 1)

第一个是第二个的简写,但第二个可能说明F#中的所有函数是如何绑定到名称的lambdas。

答案 2 :(得分:3)

除了.NET互操作之外,F#似乎比C#简单得多。 (特别是没有真正选择它,但因为它是另一种流行的.NET语言......)

采用F#函数,例如:

  • 没有神奇的“虚空”类型 - 那不是真正的类型
    • 因此,一切都是表达
  • 所有功能都是一元的
  • 功能是头等类型

就在那里你有一个比C#更容易的功能系统,其中void创建了一个特殊情况,并且没有对所有函数进行泛化。

至于你的具体问题,“let f x = x”与“let f = fun x - &gt; x”,这可能是ML的遗传特征。 (我没有看到任何特殊的原因,为什么它不能“让f =有趣的x = x”,除了它可能更令人困惑并且可能使语法更复杂?(我个人更喜欢“让f = \ xx“。))无论如何,虽然在大多数情况下它们是等价的,但有时你必须定义一个句法函数而不是一个函数值。

不幸的是,.NET互操作可能会使事情变得更复杂,尽管可能不会比其他.NET语言更多或更多。

答案 3 :(得分:2)

您提到的两个表达式中只有一个使用赋值运算符。

这定义了一个绑定到标识符“inc”的函数,它接受一个int类型的参数并返回参数+1。

let inc x = x + 1;

另一方面,这是表示λ的表达式。它必然没有标识符不能单独存在。它必须是更大表达的一部分。

fun x -> x + 1

答案 4 :(得分:2)

如果您正在寻找F#的备忘单,这是我定期使用的备忘单。

fsharpcheatsheet.pdf

它不包括所有内容,例如度量单位或引用,并且不讨论各种库,但它确实涵盖了很多语法。

答案 5 :(得分:1)

http://www.samskivert.com/code/fsharp/fsharp-cheat-sheet.pdf

这是一本非常全面的备忘单,通过学习F#帮助我解决了很多问题

答案 6 :(得分:0)

请注意,您可以直接在表达式中应用lambda。

let i = (fun x -> x + 1)0  //i equal 1